2017-08-13 7 views
5

の一定量を持っている場合、これは私がこれまで持っているものです確認するために使用する任意の文字列にアルファベットの定義します3文字の単語を選んでもらえますが、この部分を動作させることはできません。私は一般的にコーディングするのが初めてで、Pythonは私が学んだ最初の言語なので、おそらく大きなばかげたミスをしているのです。は、後の単語が文字

+5

変数 'alphabet'を印刷しましたか? – klutt

+0

@kluttはい、それは常に "a"だけを出力します。私はあなたが 'または'ステートメントを持っているならば、Pythonでかなり確信しています。オプションを指定すると、常に最初の 'または'を実行します。私はアルファベット全体をスキャンして文字を見つけることができるかどうかを確認し、そうであればアルファベットの隣にあるアルファベットの別の文字を見つけて3文字の単語を見つける。 –

答えて

0
words = [word for word in line.split() if len(word) == 3 and all(ch in ascii_lowercase for ch in word)] 
5

あなたはいくつかの良いアイデアを持っているが、関数の合成のようなものが本当に関数型言語のために予約されている(このようなつまり、構文はHaskellでうまくいくでしょう!)

Pythonでは、"a" or "b" or ...はただ1つの値に評価されますそれはあなたがそれを使用しようとしているような機能ではありません。すべての価値観には「真実性」があります。すべての文字列は空でない場合は「真実」です(例:bool("a") == True、ただしbool("") == False)。 "a"に、より具体的に(最初の値が「truthy」であることからorは、ここでは何も変わらないので、alphabetTrueに評価されます。

letter_word_3は、(常にTrueである、any("a" + "a" + "a")を行おうと"a")が

truthyであるため、あなたの代わりに何をすべきか

に各単語を長チェック、それは"abcdefghijklmnopqrtuvwxyz"であることを確認しますするには、各文字を確認してください。ちょっと待って、あなたは私がちょうど導入誤りに気付きましたか?もう一度その文字列を読む。私は忘れてしまっています"s"などあなたかもしれない!幸いなことに、Pythonのstdlibには、この文字列があります。

from string import ascii_lowercase # a-z lowercase. 

def is_three_letter_word(word): 
    if len(word) == 3: 
     if all(ch in ascii_lowercase for ch in word): 
      return True 
    return False 

# or more concisely: 
# def is_three_letter_word(word): 
#  return len(word) == 3 and all(ch in ascii_lowercase for ch in word) 
3

letter_word_3が変数関数であり、ではないことが、より論理的です。 は、ここでは、letter_word_3を実装し、あなたのコードでそれを使用することができます方法は次のとおりです。

alphabet = 'abcdefghijklmnopqrstuvwxyz' 

def letter_word_3(word): 
    return len(word) == 3 and all(x in alphabet for x in word) 

print("Testing: ice") 

if letter_word_3("ice"): 
    print("Worked!") 
else: 
    print("Didn't work") 

それは関数オブジェクトを印刷するにはあまり意味がありませんので、私はletter_word_3を印刷する最後の行を削除しました。

alphabet = "abcdefghijklmnopqrstuvwxyz" 

letter_word_3 = [a+b+c for a in alphabet for b in alphabet for c in alphabet] 

print("Testing: ice") 

if "ice" in letter_word_3: # it will search amongst 17000+ strings! 
    print("Worked!") 
else: 
    print("Didn't work") 

print(letter_word_3) # it will print 17000+ strings! 

を、これは非常にもちろんです:

は当初、私は間違ってあなたのコードはすべて3文字の文字列を生成し、「氷」は、それらのの間であるかどうかを確認し、次のようにそれを修正に持っていたと仮定しました非効率的なので、しないでください。しかし、議論されて以来、私はここでそれを残します。

あなたは、Pythonについて知っておくべきいくつかの有用なもの:

  • 文字列は配列であるので、彼らは(文字単位)反復することができる
  • x場合は文字が文字列自体
  • x in sequence戻りTrueですが含まれている。sequence
  • a or baと評価すると、が、それ以外の場合は、しかし+

と連結することができTrue

  • 二つの文字列にb
  • (空でない)文字列が評価に評価され、私はあなたがPython言語についての良い導入を読んでお勧めします。

  • +1

    'letter_word_3'は非常に長くなり、何度もメンバーシップをチェックするとかなり高価になります。 (私はあなたが知っている*あなたがこれを知っているが、OPのために...) –

    +0

    まあ、この解決策は非常に不十分です。 'letter_word_n'のサイズはnです!したがって、このソリューションをn> 13に使用することはほとんど不可能です。 – klutt

    +0

    あなたは正しいです、私はOPがしたいことを誤って解釈しました。私は一番上に2番目の解決策を追加しましたが、それはもっと説得力がありますが、古いものを参考にしました。 – fferri

    5

    いくつかの問題があります。最初にalphabetであり、常に"a"と評価されています。

    宣言の中のorは、「前のものが偽であれば、これを代わりに使用する」という意味です。 "a"が真実なので、そこで停止します。残りの手紙はPythonでさえ見ていません。

    次はanyです。 anyは、iterableの何かが真であるかどうかをチェックするだけです。 alphabet + alphabet + alphabet"aaa"と評価されているので、letter_word_3は常にTrueを返します。

    "ice" == letter_word_3 'が"ice" == Trueと評価されているかどうかをチェックすると、

    任意のワードは3つの文字は、次の手順を使用している最も簡単な方法であるかどうかを確認するには、次の

    import re 
    def is_three_letters(word): 
        return bool(re.match(r"[a-zA-Z]{3}$", word)) 
    

    をあなたはその後、

    import re 
    def is_three_letters(word): 
        return bool(re.match(r"[a-zA-Z\d]{3}$", word)) 
    
    を使用し、また数字を許可するに

    is_three_letters("ice") # True 
    is_three_letters("ICE") # True 
    is_three_letters("four") # False 
    is_three_letters("to") # False 
    is_three_letters("111") # False (numbers not allowed) 
    

    を使用することができます

    「h2o」のようなものも3文字の単語と見なされます。

    EDIT:

    import re 
    def is_three_letters(word): 
        return bool(re.match(r"[a-z]{3}$", word)) 
    

    上記のコードは、小文字(NO数字または大文字)を可能にします。

    import re 
    def is_three_letters(word): 
        return bool(re.match(r"[a-z\d]{3}$", word)) 
    

    小文字と数字(大文字は使用できません)のみです。

    EDIT:

    のnをチェックするために文字の量を、単に「{3}」あなたは上記のコード内の文字列で、好きな長さに変更します。例えば

    import re 
    def is_eight_letters(word): 
        return bool(re.match(r"[a-zA-Z\d]{8}$", word)) 
    

    上記では、大文字、小文字、および数字を許可する8語の単語を探します。

    +0

    N.B. '[a-zA-Z]'は大文字を許可します –

    +0

    すべての場合に固定されました。 @アダムスミス – ChristianFigueroa

    3

    この最も簡単な実装は、以下の機能を使用することです:

    def is_three_letter_word(word): 
        return len(word) == 3 and word.isalpha() 
    

    ので、例えば:allを使用して

    >>> is_three_letters("ice") # True 
    True 
    >>> is_three_letters("ICE") # True 
    True 
    >>> is_three_letters("four") # False 
    False 
    >>> is_three_letters("to") # False 
    False 
    >>> is_three_letters("111") # False (numbers not allowed) 
    False 
    

    は大丈夫ですが、構築された使用するよりも速くなりません - 文字列メソッド。さらに、あなたは車輪を再構築すべきではありません。言語が適切な方法を提供する場合は、それを使用する必要があります。

    関連する問題