简体   繁体   English

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

[英]Generate a list of dictionaries with all combinations from 3 dictionaries

I want to generate a list of dictionaries of ALL combinations that are derived from 3 list of dictionaries combining their keys: 我想生成所有组合的字典列表,这些字典是从组合其键的3个字典列表派生而来的:

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

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

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

As a result i want all combinations of merging them: 结果,我希望合并它们的所有组合:

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'},
.
.
.
.
    ]

I have read some info about itertools.product but have not manage to solve it. 我已经阅读了有关itertools.product的一些信息,但尚未设法解决。

You can use itertools.product with dictionary unpacking: 您可以将itertools.product与字典解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)]

Output: 输出:

[{'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'}]

Edit: solution without unpacking: 编辑:无需拆包的解决方案:

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

More generic solution: 更通用的解决方案:

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

You could also use collections.ChainMap() to the merge the cartesian products from itertools.product() : 您还可以使用collections.ChainMap()合并来自itertools.product()的笛卡尔乘积:

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)

Output: 输出:

[{'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'}]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM