2017-09-29 8 views
2
fly= input("give me an input") 
list=["f","r","u","i","t"] 

letter=0 
for i in list: 
    if i==(fly(letter)): 
     print("valid") 
     letter +=1 
    else: 
     print("invalid") 

出力には、その単語に含まれる文字に基づいてその単語が有効かどうかが表示されます。出力を構成する文字のリストから「有効な」/「無効な」出力を取得するにはどうすればよいですか?

私はPythonでかなり新しいです。私は、入力が "f"、 "r"、 "u"、 "i"、 "t"の文字でしか構成できないときに出力が有効かどうかを調べたいと思います。結果は無効でなければなりません。したがって、単語のフルーツの任意の置換は有効ですが、入力が "tfruh"の場合、不要な文字 "h"のため無効と表示されます。しかし、すべての文字が含まれている必要はないので、入力は "fru"であり、有効でなければなりません。また、どのように無効な文字の位置を見つけて印刷することができますか?使用できる文字のリストは、それが含まれている場合は、チェックし、あなたの入力内の各文字について

fly= input("give me an input ") 
mylist=["f","r","u","i","t"] 

letter=0 
for i in fly: 
    if i in mylist: 
     print("valid") 
     letter +=1 
    else: 
     print("invalid") 

+1

画像の代わりに実際のコードをご記入ください。それは他のSOコミュニティのメンバーがプログラムを読んで実行するのに役立ち、時間を無駄にすることなく、より効率的にあなたを助けることができます –

+0

これは私の最初の投稿でありがとうございます次回より慎重になります! :) – Cabbage55

+0

'フライ(文字)'はあまり意味がありません。 'fly'が関数であれば、それは' letter'を引数として渡して関数を呼び出します。しかし、あなたのコードでは、 'fly'は' input'関数によって返された文字列の名前です。ところで、 'list'を変数名として使うべきではありません。なぜなら、' list'は組み込みの 'list'型をシャドーするからです。 –

答えて

0

文字が有効かどうかをテストする効率的な方法は、有効な文字セットを使用することです。また、組み込みのenumerate関数を使用すると、単語とその位置の文字を同時に取得することができます。

allowed = set('fruit') 

words = ('fitur', 'iursfgt', 'ffrruuiitt', 'FRUIT') 
for word in words: 
    print(word) 
    valid = True 
    for i, c in enumerate(word): 
     if c not in allowed: 
      print('Bad char', c, 'at position', i) 
      valid = False 
    if valid: 
     print(word, 'is valid\n') 
    else: 
     print(word, 'is invalid\n') 

出力

fitur 
fitur is valid 

iursfgt 
Bad char s at position 3 
Bad char g at position 5 
iursfgt is invalid 

ffrruuiitt 
ffrruuiitt is valid 

FRUIT 
Bad char F at position 0 
Bad char R at position 1 
Bad char U at position 2 
Bad char I at position 3 
Bad char T at position 4 
FRUIT is invalid 
あなたは rangeをループ、およびへのインデックスにそれを使用することによって、あなたは、この使用して間接的な繰り返しを行うことができます enumerateを使用することが許可されていない場合は

言葉。そして、あなたはの許可された文字のセットを使用する必要はありません、あなただけの文字列、またはリストを使用することができます。

allowed = 'fruit' 
words = ('fitur', 'iursfgt', 'ffrruuiitt', 'FRUIT') 
for word in words: 
    print(word) 
    valid = True 
    for i in range(len(word)): 
     c = word[i] 
     if c not in allowed: 
      print('Bad char', c, 'at position', i) 
      valid = False 
    if valid: 
     print(word, 'is valid\n') 
    else: 
     print(word, 'is invalid\n') 

このコードは、以前のバージョンと同じ出力を生成します。


ちょうど楽しみのため、ここにはほとんど判読できないバージョンがあります。 ;)

allowed = set('fruit') 
words = ('fitur', 'iursfgt', 'ffrruuiitt', 'FRUIT') 
for word in words: 
    a = [word] 
    a.extend(f'Bad char {c} at position {i}' for i, c in enumerate(word) 
     if c not in allowed) 
    a.append(f"{word} is {('in', '')[not a]}valid\n") 
    print('\n'.join(a)) 

これは間違いなくないこれをコーディングするための良い方法です!

+0

enumarate関数を使用せずにforループとif文を使用するだけで無効な文字の位置を見つけることができますか?出力は次のようになります: "X(位置2)は有効な文字ではありません"解決策のためにはitelyもこれを試してみましょう! – Cabbage55

+0

@ Cabbage55はい、あなたは 'enumerate'なしでそれを行うことができますが、代替案はきれいではありません。 'enumerate'は非常に重要な組み込み関数なので、使い方を学ぶのがいいアイデアです。もちろん、これが宿題であり、あなたが 'enumerate'を使うことを許されていなければ、それは別の問題です。 ;) –

+0

例えば、 'enumerate'の代わりに、範囲(len(word):' 'c = word [i]'など)で 'for 'を実行することができますが、' for'ループを 'range'文字列の上では、Pythonでは悪いスタイルと見なされますが、効率が悪く、コードが複雑になり、読みにくくなりがちです。 –

1

あなたはこのコードを使用することができます。

+0

ありがとうございました!私はそれを働いた:) – Cabbage55

0

あなたの単語が有効な単語(単語の各文字があなたのリスト内にあるかどうか)をチェックし、無効な文字のインデックスでコードを壊します(以下のようなコメントがコード):

def check_validity(word): 
    my_list = ["f", "r", "u", "i", "t"] 
    #^don't use `list` as variable name as it is an in-built data type 

    # `enumerate` allows to iterate the list returning the index as well 
    for i, c in enumerate(word): 
     # check character of your string is not in your list 
     if c not in my_list: 
      print("invalid character '{}'' at index: {}".format(c, i)) 
      break # break loop if condition satisfies 
    else: 
     print("Valid word: {}".format(word)) 

実行サンプル

>>> check_validity("fruit") 
Valid word: fruit 
>>> check_validity("itf") 
Valid word: itf 
>>> check_validity("frugit") 
invalid character 'g'' at index: 3 

注:私はこれらの関数に文字列を渡していますが、あなたはあなたのケースで(ここではinput()によって返された値を渡し、 fly変数)。

+0

私はしばらくあなたの関数に取り組んできましたし、いくつかの機能を追加しようとしましたが、失敗しました:(例えば、関数は、リストに属していない最初の間違った文字を与えると、私は0を設定して+ 1を追加しましたが、無効な最初の文字の値を増やしたので、次の無効な文字ごとに同じことをする必要があります。 – Cabbage55

+0

@ Cabbage55あなたは関数が無効な文字をすべて出力するべきであることを意味しますか?はいの場合、関数Iから 'break'文を削除する必要があります共有 –

関連する問題