我使用itertools尝试了不同的方法,但无法弄清楚。
我需要找到字典的不同组合:
RS
现在有一个词典列表{letter:number} 现在,我需要创建一个组合列表,其中键(字母)仅出现一次。
预期的输出如下所示:
R'S x PQ/|PQ|
如果有人可以帮我解决这个问题,那就太好了!
答案 0 :(得分:1)
您可以从输入长度得出的范围内生成整数的所有组合,然后使用zip
:
letters = ['a','b','c']
def combos(d, c = []):
if len(c) == len(d):
yield dict(zip(letters, c))
else:
for i in d:
yield from combos(d, c+[i])
print(list(combos(range(len(letters))))
输出:
[{'a': 0, 'b': 0, 'c': 0},
{'a': 0, 'b': 0, 'c': 1},
{'a': 0, 'b': 0, 'c': 2},
{'a': 0, 'b': 1, 'c': 0},
{'a': 0, 'b': 1, 'c': 1},
...
{'a': 2, 'b': 2, 'c': 2}]
答案 1 :(得分:0)
您正在寻找的是itertools.product
from itertools import product
lst = []
for a, b, c in product([0, 1, 2], repeat=3):
lst.append({'a': a, 'b': b, 'c': c})
print(lst)
输出:
[{'a': 0, 'b': 0, 'c': 0},
{'a': 0, 'b': 0, 'c': 1},
{'a': 0, 'b': 0, 'c': 2},
{'a': 0, 'b':1, 'c': 0},
{'a': 0, 'b': 1, 'c': 1},
{'a': 0, 'b': 1, 'c': 2},
{'a': 0, 'b': 2, 'c': 0},
{'a': 0, 'b': 2, 'c': 1},...
更新
我们可以使用列表理解将所有内容压缩为一行。
letters = ['a','b','c']
lst = [dict(zip(letters, x)) for x in product(range(len(letters)), repeat=len(letters))]
print(lst)