我有以下字母列表:
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')
结果是灾难,你们可以理解。
答案 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']
请注意,这只会查看唯一字母。 apple
是letters
集{'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']