[英]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.