1

ユーザーが入力した単語のすべての文字がリスト内の別の単語に含まれているかどうかを確認するPythonプログラムを作成しています。したがって、たとえば、ユーザーが「メンフィス」と入力した場合、プログラムは同じ文字をすべて含む単語のリスト(「婉曲表現」、「メンバーシップ」、「謄写版」など)を印刷する必要があります。

wordList = ["blah", "blah", "blah"]
userWord = input("Enter a word to compare: ")

userLetters = list(userWord)    #Converting user-inputted string to list of chars

matches = []         #Empty list for words that might match later.

for word in wordList:
    mismatchCount = 0          #Setting/resetting count of clashes between words
    wordLetters = list(word)   #Converting word of comparison into list of chars

    for letter in userLetters:
        if letter in wordLetters:
            userLetters.remove(letter)   #Removing already-matched letters
            wordLetters.remove(letter)   #Removing already-matched letters
        else:   
            mismatchCount += 1

    if mismatchCount > 0:       
        continue                    #Mismatch--abandons word and moves to next
    matches.append(word)    #If word fails the above IF, it gets added to matches

print(matches)

問題は、単語の大きなリストにあるどの単語もテストに失敗していないことです。失敗するはずの単語でさえ、一致リストに追加されます。したがって、大きなリストと比較するために「メンフィス」と入力すると、リスト内のすべての単語が印刷されます。

何か案は?前もって感謝します。

4

3 に答える 3

3

すべてのリスト要素を終了する前に、Pythonループが(エラーをスローせずに)反復を停止する理由は何ですか?

userLetters.remove(letter)いいえ。ただし、特定の例では、反復処理中に反復可能オブジェクトのサイズを変更しています。for letter in userLetters:

Pythonでは、動作は明確に定義されており、反復中に要素をスキップすることになります。

または、反復している反復可能ファイルのコピーを作成する必要がありますfor letter in userLetters[:]:

于 2013-03-25T06:20:13.410 に答える
0

歩いているリストからアイテムを削除しないでください。リストのコピーを作成します。たとえば、次を使用し[:]ます。

...
for letter in userLetters[:]:
    if letter in wordLetters:
...
于 2013-03-25T06:22:38.740 に答える
0

私はそれを次のように実装します

filter(set(userWord).issubset, wordList)

例:

>>> filter(set("23").issubset, ["foo", "3foo2"])
['3foo2']
于 2013-03-25T06:28:44.113 に答える