在字典中从不同键选取每个字母,找出所有组合
假设我们有这样一个数据结构:
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',以此类推。
这样做的目的是为了检查这些组合是否在字典中是有效的英文单词。我原本以为先列出所有组合,然后再进行检查会是最快的方式,但如果不是这样的话,我希望能得到一些建议。
4 个回答
1
没有使用itertools:
def combination(x):
list1 = g.values()[0]
list2 = g.values()[1]
for i in list1:
for j in list2:
print(i+j)
combination({'1':['a','b'], '2':['c','d']})
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'
...
8
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