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

2024-09-29 02:21:50 发布

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

我有三份清单:

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优化器库)


Tags: infor格式rangemtcostn2james
3条回答

这可以通过对{}和{}使用itertools.product(每个值的组合)的组合来实现,然后对结果元组和Cost列表之间的对应值对使用zip

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)})

输出:

{('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)])

相关问题 更多 >