繁体   English   中英

Python - 匹配列表中的单词字母

[英]Python - match letters of words in a list

我正在尝试创建一个简单的程序,用户输入几个字母

输入字母: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)

如果你想要单词里面的all字母:

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

你的代码的问题是内部循环内部的break Python没有一个允许一次打破多个循环的结构(你想要的)

您可以使用Set或FrozenSet改进spee

如果您查看该文档,它会提到测试成员资格的情况:

set对象是不同的可哈希对象的无序集合。 常见用途包括成员资格测试 ,从序列中删除重复项,以及计算数学运算,如交集,并集,差异和对称差异。

列表推导肯定是要走的路,但只是为了解决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(..)

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构建一个键来做类似的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM