2

ユーザーが数文字を入力する簡単なプログラムを作成しようとしています

文字を入力してください: abc

次に、リストにある単語のリストを調べて、「a」、「b」、および「c」を含む単語と一致させたいと考えています。

これは私がこれまで運がなかったものです

for word in good_words: #For all words in good words list
    for letter in letters: #for each letter inputed by user
        if not(letter in word):
            break
    matches.append(word)
4

4 に答える 4

10

all単語内の文字が必要な場合:

[word for word in good_words if all(letter in word for letter in letters)]

あなたのコードの問題は、break内側のループの内側にあります。Python には、一度に複数のループを中断できる構造がありません (そして、それが必要でした)。

于 2012-07-11T05:53:06.757 に答える
2

Setまたは FrozenSetを使用して速度を改善できる可能性があります

ドキュメントを見ると、メンバーシップをテストする場合について言及されています。

セット オブジェクトは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。一般的な用途には、メンバーシップ テスト、シーケンスからの重複の削除、交差、和、差、対称差などの数学演算の計算などがあります。

于 2012-07-11T05:58:43.483 に答える
0
import collections

まず、単語リスト内の文字の出現回数を計算します。

words_by_letters = collections.defaultdict(list)
for word in good_words:
    key = frozenset(word)
    words_by_letters[key].append(word)

次に、特定の文字が出現する単語を探すだけです。これは、各単語を個別にチェックするよりも高速であることが期待されます。

subkey = set(letters)
for key, words in words_by_letters.iteritems():
    if key.issuperset(subkey):
        matches.extend(words)

文字の繰り返しを追跡したい場合は、 からキーを作成することで同様のことができますcollections.Counter

于 2012-07-11T06:13:33.037 に答える