如何使用Python搜索给定字母列表的单词列表

时间:2017-11-11 18:03:16

标签: python

我有以下字母列表:

letters = ['t', 'u', 'v', 'w', 'x', 'y', 'z']

以下单词列表:

words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']

如果字母列表中存在任何单词组合,我如何使用Python进行搜索?就像看着它一样,我们可以观察到两个词“yutz'和&#t; tux'是唯一一个可以为我们的信件列表建立的信息。

我是Python的新手,我尝试制作不同的for循环但无法到达任何地方。

for word in words:
    for i in letters:
        if i in word:
            print(word)
        else:
            print('not in word')

结果是灾难,你们可以理解。

4 个答案:

答案 0 :(得分:5)

您需要根据sets来查看问题。您的words列表中的任何单词都是您的字母集的子集,可以由这些字母组成。换句话说,letters需要成为单词的超集:

letters = {'t', 'u', 'v', 'w', 'x', 'y', 'z'}  # a set, not a list
for word in words:
    if letters.issuperset(word):
        print(word)

如果可迭代参数的所有元素都在集合中,则set.issuperset() method返回true。

如果你想要一个列表,只需使用列表理解:

[word for word in words if letters.issuperset(word)]

演示:

>>> words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']
>>> letters = {'t', 'u', 'v', 'w', 'x', 'y', 'z'}  # a set, not a list
>>> [word for word in words if letters.issuperset(word)]
['yutz', 'tux']

请注意,这只会查看唯一字母appleletters{'a', 'p', 'l', 'e'}的子集。如果您还需要处理字母计数,则需要使用 multiset ; Python有一个名为collections.Counter()的实现。这不仅可以跟踪字母,还可以跟踪其数量。

Counter类型不支持对子网或超网的测试,因此您必须使用减法;如果产生空Counter(),整个单词可以由字母计数形成:

letters = Counter(['a', 'p', 'l', 'e', 'p', 'i'])
words = ['apple', 'applepie']
for word in words:
    if Counter(word) - letters:
        print(word)

或作为列表理解:

[word for word in words if Counter(word) - letters]

产生['apple'],因为输入字母多组中只有一个'e',而且只有2 'p' s,而不是3。

答案 1 :(得分:3)

您可以在此处使用set.difference

r = [w for w in words if not set(w).difference(letters)]

r
['yutz', 'tux']

如果结果为空集,则表示w中的每个字符都属于letters。如果是这种情况,set.difference会返回一个空的set,即False - y,因此not ....会生成True并打印该字词。这相当于:

for w in words:
    if not set(w).difference(letters):
        print(w)

yutz
tux

这类似于使用set.issuperset进行测试,但从不同角度解决问题。

答案 2 :(得分:0)

您可以将all函数与生成器一起使用,以确定words中是否存在属于letters的单词中的所有字符:

letters = ['t', 'u', 'v', 'w', 'x', 'y', 'z']
words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']
final_words = [i for i in words if all(c in letters for c in i)]

输出:

['yutz', 'tux']

答案 3 :(得分:-2)

  

您可以使用itertool的排列方法:

在一行中:

print(set(["".join(permutation) for item in words for permutation in itertools.permutations(letters,len(item)) if "".join(permutation) in words ]))

详细解决方案:

以上列表理解与:

相同
words = ['apple', 'whisky', 'yutz', 'xray', 'tux', 'zebra']

letters = ['t', 'u', 'v', 'w', 'x', 'y', 'z']
import itertools

final=[]
for i in words:
    for k in itertools.permutations(letters,len(i)):
        if "".join(k) in words and "".join(k) not in final:
            final.append("".join(k))

print(final)

输出:

['yutz', 'tux']