如果我在变量字中有一个单词列表,在变量字母中有一个字母列表,我怎样才能找到所有可以用字母组成的单词。可以使用可变字母中的任何字母子集,并且可以多次使用字母。我想用Python做到这一点。
例如:
letters = ['a', 'b', 'i', 'l', 'r', 's', 't', 'u']
words = ['dummy', 'australia']
应该返回:
'australia'
即使有一个额外的'b',但不是:
'dummy'
因为d,m和y不可用。
答案 0 :(得分:3)
使用正则表达式:
>>> import re
>>> m = re.compile('^[abilrstu]+$')
>>> m.match('australia') is not None
True
>>> m.match('dummy') is not None
False
>>> m.match('australian') is not None
False
答案 1 :(得分:0)
您可以将all()
与sets
一起使用,因为它们允许O(1)
会员资格检查:
In [9]: words = ['dummy', 'australia']
In [10]: letters = ['a', 'b', 'i', 'l', 'r', 's', 't', 'u']
In [11]: let_set=set(letters)
In [12]: for word in words:
if all(x in let_set for x in set(word)):
print word
....:
australia
答案 2 :(得分:0)
这可能是最简单的方法:
result = [w for w in words if all(i in letters for i in w)]
这会返回['australia']
答案 3 :(得分:0)
这采用了设置交集,可能更快。另一方面,它需要额外的内存。
letters = ['a', 'b', 'i', 'l', 'r', 's', 't', 'u']
words = ['dummy', 'australia', 'australians' ]
f = set(letters)
c = [ (word, set(word)) for word in words ]
# changing to s & f == f makes condition "must use ALL letters"
s = [ w for (w, s) in c if s & f == s ]
现在是['australia']
(但我很好奇使用这样的解决方案。一个Scrabble机器人?尘土飞扬的键盘攻击对字典密码?)