生成包含3个词典的所有组合的词典列表

2024-05-14 12:48:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我要生成一个包含所有组合的字典列表,这些组合是从3个组合键的字典列表中派生出来的:

products = [{'product':'product1'},{'product':'product2'},{'product':'product3'},{'product':'product4'}]

sales = [{'sale':'sale1'},{'sale':'sale2'}]

invoices = [{'invoice':'invoice1'},{'invoice': 'invoice2'},{'invoice':'invoice3'}]

因此,我希望合并它们的所有组合:

combination_list = [
    {'product':'product1', 'sale':'sale1','invoice':'invoice1'},
    {'product':'product2', 'sale':'sale1','invoice':'invoice1'},
    {'product':'product3', 'sale':'sale1','invoice':'invoice1'},
    {'product':'product3', 'sale':'sale2','invoice':'invoice1'},
    {'product':'product3', 'sale':'sale3','invoice':'invoice1'},
.
.
.
.
    ]

我读了一些关于itertools.产品但还没有解决。你知道吗


Tags: 列表字典invoicesaleproductproductssales组合键
2条回答

您还可以使用^{}合并来自^{}的笛卡尔积:

from collections import ChainMap
from itertools import product
from pprint import pprint

products = [
    {"product": "product1"},
    {"product": "product2"},
    {"product": "product3"},
    {"product": "product4"},
]

sales = [{"sale": "sale1"}, {"sale": "sale2"}]

invoices = [{"invoice": "invoice1"}, {"invoice": "invoice2"}, {"invoice": "invoice3"}]

result = [dict(ChainMap(*x)) for x in product(products, sales, invoices)]

pprint(result)

输出:

[{'invoice': 'invoice1', 'product': 'product1', 'sale': 'sale1'},
 {'invoice': 'invoice2', 'product': 'product1', 'sale': 'sale1'},
 {'invoice': 'invoice3', 'product': 'product1', 'sale': 'sale1'},
 {'invoice': 'invoice1', 'product': 'product1', 'sale': 'sale2'},
 {'invoice': 'invoice2', 'product': 'product1', 'sale': 'sale2'},
 {'invoice': 'invoice3', 'product': 'product1', 'sale': 'sale2'},
 {'invoice': 'invoice1', 'product': 'product2', 'sale': 'sale1'},
 {'invoice': 'invoice2', 'product': 'product2', 'sale': 'sale1'},
 {'invoice': 'invoice3', 'product': 'product2', 'sale': 'sale1'},
 {'invoice': 'invoice1', 'product': 'product2', 'sale': 'sale2'},
 {'invoice': 'invoice2', 'product': 'product2', 'sale': 'sale2'},
 {'invoice': 'invoice3', 'product': 'product2', 'sale': 'sale2'},
 {'invoice': 'invoice1', 'product': 'product3', 'sale': 'sale1'},
 {'invoice': 'invoice2', 'product': 'product3', 'sale': 'sale1'},
 {'invoice': 'invoice3', 'product': 'product3', 'sale': 'sale1'},
 {'invoice': 'invoice1', 'product': 'product3', 'sale': 'sale2'},
 {'invoice': 'invoice2', 'product': 'product3', 'sale': 'sale2'},
 {'invoice': 'invoice3', 'product': 'product3', 'sale': 'sale2'},
 {'invoice': 'invoice1', 'product': 'product4', 'sale': 'sale1'},
 {'invoice': 'invoice2', 'product': 'product4', 'sale': 'sale1'},
 {'invoice': 'invoice3', 'product': 'product4', 'sale': 'sale1'},
 {'invoice': 'invoice1', 'product': 'product4', 'sale': 'sale2'},
 {'invoice': 'invoice2', 'product': 'product4', 'sale': 'sale2'},
 {'invoice': 'invoice3', 'product': 'product4', 'sale': 'sale2'}]

可以将itertools.product与字典解包一起使用:

from itertools import product
products = [{'product':'product1'},{'product':'product2'},{'product':'product3'},{'product':'product4'}]
sales = [{'sale':'sale1'},{'sale':'sale2'}]
invoices = [{'invoice':'invoice1'},{'invoice': 'invoice2'},{'invoice':'invoice3'}]
result = [{**a, **b, **c} for a, b, c in product(products, sales, invoices)]

输出:

[{'product': 'product1', 'sale': 'sale1', 'invoice': 'invoice1'}, {'product': 'product1', 'sale': 'sale1', 'invoice': 'invoice2'}, {'product': 'product1', 'sale': 'sale1', 'invoice': 'invoice3'}, {'product': 'product1', 'sale': 'sale2', 'invoice': 'invoice1'}, {'product': 'product1', 'sale': 'sale2', 'invoice': 'invoice2'}, {'product': 'product1', 'sale': 'sale2', 'invoice': 'invoice3'}, {'product': 'product2', 'sale': 'sale1', 'invoice': 'invoice1'}, {'product': 'product2', 'sale': 'sale1', 'invoice': 'invoice2'}, {'product': 'product2', 'sale': 'sale1', 'invoice': 'invoice3'}, {'product': 'product2', 'sale': 'sale2', 'invoice': 'invoice1'}, {'product': 'product2', 'sale': 'sale2', 'invoice': 'invoice2'}, {'product': 'product2', 'sale': 'sale2', 'invoice': 'invoice3'}, {'product': 'product3', 'sale': 'sale1', 'invoice': 'invoice1'}, {'product': 'product3', 'sale': 'sale1', 'invoice': 'invoice2'}, {'product': 'product3', 'sale': 'sale1', 'invoice': 'invoice3'}, {'product': 'product3', 'sale': 'sale2', 'invoice': 'invoice1'}, {'product': 'product3', 'sale': 'sale2', 'invoice': 'invoice2'}, {'product': 'product3', 'sale': 'sale2', 'invoice': 'invoice3'}, {'product': 'product4', 'sale': 'sale1', 'invoice': 'invoice1'}, {'product': 'product4', 'sale': 'sale1', 'invoice': 'invoice2'}, {'product': 'product4', 'sale': 'sale1', 'invoice': 'invoice3'}, {'product': 'product4', 'sale': 'sale2', 'invoice': 'invoice1'}, {'product': 'product4', 'sale': 'sale2', 'invoice': 'invoice2'}, {'product': 'product4', 'sale': 'sale2', 'invoice': 'invoice3'}]

编辑:不解包的解决方案:

result = [{'product':a['product'], 'sale':b['sale'], 'invoice':c['invoice']} for a, b, c in product(products, sales, invoices)]

更通用的解决方案:

result = [dict(c for b in map(dict.items, i) for c in b) for i in product(products, sales, invoices)]

相关问题 更多 >

    热门问题