3 回答
TA贡献1844条经验 获得超8个赞
看起来有点复杂,但一个相当简单的解决方案:
import itertools
D = [D1, D2, D3, D4, ...]
dicts = [
dict(zip([f'D{i+1}' for i in range(len(D))], iter))
for iter in itertools.product(*[list(d.keys()) for d in D])
]
dict_1 = dicts[0]
dict_2 = dicts[1]
...
dicts = [
{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'H'},
{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'I'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'H'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'I'},
...
]
这个怎么运作:
生成所有键组合
itertools.product(*[list(d.keys()) for d in D])
将组合与适当的字典名称结合起来
zip([f'D{i+1}' for i in range(len(D))], iter))
将这两个部分组合起来并将它们中的每一个转换为字典
[
dict(zip([f'D{i+1}' for i in range(len(D))], iter))
for iter in itertools.product(*[list(d.keys()) for d in D])
]
TA贡献1797条经验 获得超4个赞
你想要的是你的字典的笛卡尔积。幸运的是,itertools定义了一个product完全可以做到这一点的函数。
当用作可迭代对象时,adict将产生其键,因此product(D1, D2, ...)将直接产生键元组,例如('A', 'D', 'F', ...).
您需要进行一些调整才能获得所需的输出:
from pprint import pprint
import itertools
dicts = [
{"A": 1, "B": 3, "C":6},
{"D": 4},
{"E": 8, "F": 12, "G": 2},
{"H": 9, "I": 3}
]
r = [
{f"D{i}": key for i, key in enumerate(x, 1)}
for x in itertools.product(*dicts)
]
pprint(r)
输出:
[{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'H'},
{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'I'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'H'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'I'},
{'D1': 'A', 'D2': 'D', 'D3': 'G', 'D4': 'H'},
{'D1': 'A', 'D2': 'D', 'D3': 'G', 'D4': 'I'},
{'D1': 'B', 'D2': 'D', 'D3': 'E', 'D4': 'H'},
{'D1': 'B', 'D2': 'D', 'D3': 'E', 'D4': 'I'},
{'D1': 'B', 'D2': 'D', 'D3': 'F', 'D4': 'H'},
{'D1': 'B', 'D2': 'D', 'D3': 'F', 'D4': 'I'},
{'D1': 'B', 'D2': 'D', 'D3': 'G', 'D4': 'H'},
{'D1': 'B', 'D2': 'D', 'D3': 'G', 'D4': 'I'},
{'D1': 'C', 'D2': 'D', 'D3': 'E', 'D4': 'H'},
{'D1': 'C', 'D2': 'D', 'D3': 'E', 'D4': 'I'},
{'D1': 'C', 'D2': 'D', 'D3': 'F', 'D4': 'H'},
{'D1': 'C', 'D2': 'D', 'D3': 'F', 'D4': 'I'},
{'D1': 'C', 'D2': 'D', 'D3': 'G', 'D4': 'H'},
{'D1': 'C', 'D2': 'D', 'D3': 'G', 'D4': 'I'}]
TA贡献1847条经验 获得超11个赞
itertools product是你的朋友:
from itertools import product
d = {"D1": {"A": 1, "B": 3, "C":6},
"D2": {"D": 4},
"D3": {"E": 8, "F": 12, "G": 2},
"D4": {"H": 9, "I": 3},
"D5": {"J": 2},
"D6": {"K": 8, "L": 1},
"D7": {"M": 2}}
res = []
for c in product(*(v.keys() for _, v in d.items())):
res.append(dict(zip(d.keys(), c)))
列表理解版本将是:
res = [dict(zip(d.keys(), c)) for c in product(*(v.keys() for _, v in d.items()))]
产生:
[{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'E', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'F', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'G', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'G', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'G', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'A', 'D2': 'D', 'D3': 'G', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'E', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'E', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'E', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'E', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'F', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'F', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'F', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'F', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'G', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'G', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'G', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'B', 'D2': 'D', 'D3': 'G', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'E', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'E', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'E', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'E', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'F', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'F', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'F', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'F', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'G', 'D4': 'H', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'G', 'D4': 'H', 'D5': 'J', 'D6': 'L', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'G', 'D4': 'I', 'D5': 'J', 'D6': 'K', 'D7': 'M'},
{'D1': 'C', 'D2': 'D', 'D3': 'G', 'D4': 'I', 'D5': 'J', 'D6': 'L', 'D7': 'M'}]
优点和缺点
(+)与其他答案不同,这个答案不依赖于模式之后的 subdicts 的命名D<i>;他们可以被称为任何东西。
(-) 必须保留 dict 的顺序,因此您需要 Python 3.5+
添加回答
举报