繁体   English   中英

如何将三个列表转换为字典,其中键取自前两个列表的笛卡尔积,值取自第三个列表

[英]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 优化器库)。

这可以使用WCitertools.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.

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