Python代码,可以找到由特定字母组成的单词。可以使用任何字母的子集

时间:2013-02-02 10:41:03

标签: python

如果我在变量字中有一个单词列表,在变量字母中有一个字母列表,我怎样才能找到所有可以用字母组成的单词。可以使用可变字母中的任何字母子集,并且可以多次使用字母。我想用Python做到这一点。

例如:

letters = ['a', 'b', 'i', 'l', 'r', 's', 't', 'u']
words = ['dummy', 'australia']

应该返回:

'australia'

即使有一个额外的'b',但不是:

'dummy'

因为d,m和y不可用。

4 个答案:

答案 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机器人?尘土飞扬的键盘攻击对字典密码?)