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 回答
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只有在允许循环一直运行时才执行。break语句完全退出循环,不matches.append(..)执行。

于 2012-07-11T06:32:02.930 回答
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 回答