[英]How to convert three lists to dicts where keys are taken from a Cartesian product of the first two lists and the values are from the third list
我有三个列表:
W = ['Anis', 'James', 'Arthur']
C = ['City1', 'City2', 'City3']
Cost = [53, 27, 13, 80, 47, 67, 53, 73, 47]
我想要这种格式的结果:
{('Anis', 'City1'): 53}
{('Anis', 'City2'): 27}
{('Anis', 'City3'): 13}
{('James', 'City1'): 80}
{('James', 'City2'): 47}
{('James', 'City3'): 67}
{('Arthur', 'City1'): 53}
{('Arthur', 'City2'): 73}
{('Arthur', 'City3'): 47}
我试过这个
`for i in range(n1):
for j in range(n1):
for c in range(n2):
combinations, mt = multidict({(W[i], C[j]): Cost[c]})
print(mt)`
我得到了这个:
{('Anis', 'City1'): 47}
{('Anis', 'City2'): 47}
{('Anis', 'City3'): 47}
{('James', 'City1'): 47}
{('James', 'City2'): 47}
{('James', 'City3'): 47}
{('Arthur', 'City1'): 47}
{('Arthur', 'City2'): 47}
{('Arthur', 'City3'): 47}
成本值在 for 循环中没有递增(我正在使用 gurobi 优化器库)。
这可以使用W
和C
的itertools.product
(值的每个组合)的组合来完成,然后zip
用于结果元组和Cost
列表之间的对应值对:
import itertools
W = ['Anis', 'James', 'Arthur']
C = ['City1', 'City2', 'City3']
Cost = [53, 27, 13, 80, 47, 67, 53, 73, 47]
for k, v in zip(itertools.product(W, C), Cost):
d = {k: v}
print(d)
这给出:
{('Anis', 'City1'): 53}
{('Anis', 'City2'): 27}
{('Anis', 'City3'): 13}
{('James', 'City1'): 80}
{('James', 'City2'): 47}
{('James', 'City3'): 67}
{('Arthur', 'City1'): 53}
{('Arthur', 'City2'): 73}
{('Arthur', 'City3'): 47}
如果实际上您想要的是单个字典而不是一系列单元素字典,则将其修改为:
d = {k: v for k, v in zip(itertools.product(W, C), Cost)}
print(d)
这使:
{('Anis', 'City1'): 53, ('Anis', 'City2'): 27, ('Anis', 'City3'): 13, ('James', 'City1'): 80, ('James', 'City2'): 47, ('James', 'City3'): 67, ('Arthur', 'City1'): 53, ('Arthur', 'City2'): 73, ('Arthur', 'City3'): 47}
或者更简单(感谢用户Heap Overflow的建议):
d = dict(zip(itertools.product(W, C), Cost))
另一种方式,使用迭代器:
cost = iter(Cost)
for w in W:
for c in C:
print({(w, c): next(cost)})
Output:
{('Anis', 'City1'): 53}
{('Anis', 'City2'): 27}
{('Anis', 'City3'): 13}
{('James', 'City1'): 80}
{('James', 'City2'): 47}
{('James', 'City3'): 67}
{('Arthur', 'City1'): 53}
{('Arthur', 'City2'): 73}
{('Arthur', 'City3'): 47}
我有两种方法可以做到。 最后你得到了你的决定,但是在一个包含这些命令的列表中。
name_place=[]
for name in W:
for city in C:
name_place.append((name, city))
final_list=[]
for i, value in enumerate(Cost):
final_list.append({name_place[i]:value})
print(final_list)
或者,对于更紧凑的代码,您可以使用 listcomprehension:
print([{[(name,city) for name in W for city in C][i]: value} for i, value in enumerate(Cost)])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.