我正在尝试创建一个用户输入几个字母的简单程序
输入字母: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)
答案 0 :(得分:10)
如果你想要all
字里面的字母:
[word for word in good_words if all(letter in word for letter in letters)]
代码的问题是内部循环中的break
。 Python没有一个允许一次打破多个循环的结构(你想要的)
答案 1 :(得分:2)
您可以使用Set或FrozenSet
来改进spee如果您查看该文档,它会提到测试成员资格的情况:
set对象是不同的hashable对象的无序集合。 常见用途包括成员资格测试,从中删除重复项 序列,并计算数学运算,如交集, 联合,差异和对称差异。
答案 2 :(得分:1)
列表理解肯定是要走的路,但只是为了解决OP在他的代码中遇到的问题:
您的break
语句仅突破最内层循环。因此,该单词仍附加到matches
。对此的快速解决方法是利用python的for... else
构造:
for word in good_words:
for letter in letters:
if letter not in word:
break
else:
matches.append(word)
在上面的代码中,else
仅在允许循环一直运行时执行。 <{1}}语句完全退出循环,break
未执行。
答案 3 :(得分: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
构建密钥来执行类似的操作。