2013-02-04 39 views
1

比方说,我们有这样的数据结构:查找字母所有组合,选择在字典中从一个不同的密钥每个字母

class Lock: 
def __init__(self): 
    self.data1 = ['a', 'd', 'e', 'l', 's'] 
    self.data2 = ['s', 'i', 'r', 't', 'n'] 
    self.data3 = ['b', 'o', 'e', 'm', 'k'] 
    self.data4 = ['f', 'y', 'u', 'n', 'g'] 

另外,

d = {'1': ['a', 'd', 'e', 'l', 's'], '2': ['s', 'i', 'r', 't', 'n'], '3': ['b', 'o', 'e', 'm', 'k'], '4': ['f', 'y', 'u', 'n', 'g'] } 

我要找到每一个可能的组合因为每个字母都是从不同的键或数组中选择的。顺序很重要,所以第一个字母总是必须来自'data1',第二个必须来自'data2'等。

其目的是然后检查这些对照字典,看看哪些是英文有效的话。我假设得到所有组合的清单,然后做检查将是最快的,但如果情况并非如此,我想要一些输入。

回答

8

使用itertools.product()

for combo in itertools.product(self.data1, self.data2, self.data3, self.data4): 
    # combo is a tuple of 4 characters. 

或:

for combo in itertools.product(*[d[k] for k in sorted(d.keys())]): 
    # combo is a tuple of 4 characters. 

演示:从马丁

>>> import itertools                            >>> d = {'1': ['a', 'd', 'e', 'l', 's'], '2': ['s', 'i', 'r', 't', 'n'], '3': ['b', 'o', 'e', 'm', 'k'], '4': ['f', 'y', 'u', 'n', 'g'] } 
>>> for combo in itertools.product(*[d[k] for k in sorted(d.keys())]): 
...  print ''.join(combo) 
... 
asbf 
asby 
asbu 
asbn 
asbg 
asof 
asoy 
asou 
ason 
asog 
asef 

... 

snkf 
snky 
snku 
snkn 
snkg 
3

很好的回答,itertools.product是最好的方式。自2.6版本推出以来,您可以回到Python 2.5及更早版本的老式风格:

>>> [i1 + i2 + i3 + i4 for i1 in data1 for i2 in data2 for i3 in data3 for i4 in data4 ] 
['asbf', 'asby', 'asbu', 'asbn', 'asbg', 'asof', 'asoy', 'asou', 'ason', 'asog', 'asef', 
'asey', 'aseu', 'asen', 'aseg', 'asmf', 'asmy', 'asmu', 'asmn', 'asmg', 'askf', 'asky', 
'asku', 'askn', 'askg', 'aibf', 'aiby', 'aibu', 'aibn', 'aibg', 'aiof', 'aioy', 'aiou', 
'aion', 'aiog', 'aief', 'aiey', 'aieu', 'aien', 'aieg', 'aimf', 'aimy', 'aimu', 'aimn', 
'aimg', 'aikf', 'aiky', 'aiku', 'aikn', 'aikg', 'arbf', 'arby', 'arbu', 'arbn', 'arbg', 
'arof', 'aroy', 'arou', 'aron', 'arog', 'aref', 'arey', 'areu', 'aren', 'areg', 'armf', 
'army', 'armu', 'armn', 'armg', 'arkf', 'arky', 'arku', 'arkn', 'arkg', 'atbf', 'atby', 
'atbu', 'atbn', 'atbg', 'atof', 'atoy', 'atou', 'aton', 'atog', 'atef', 'atey', 'ateu' 
... 
相关问题