创建包含所有字典组合的列表,其中键仅出现一次

时间:2019-11-11 20:55:48

标签: python itertools

我使用itertools尝试了不同的方法,但无法弄清楚。

我需要找到字典的不同组合:

RS

现在有一个词典列表{letter:number} 现在,我需要创建一个组合列表,其中键(字母)仅出现一次。

预期的输出如下所示:

R'S x PQ/|PQ|

如果有人可以帮我解决这个问题,那就太好了!

2 个答案:

答案 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)