微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法将2个列表和一个数组组合成一个多字典?

如何解决有没有办法将2个列表和一个数组组合成一个多字典?

我有以下数据:

from gurobipy import multidict

P = ['1','2','3','4','5','6','7','8','9'] #Projects
S = ['A','B','C','D','E','F'] #Subcontractors


C = np.array([[29,49,45,55,44,50,59],[46,57,59,56,30,34,42,36,49],[55,46,9,29,22,34],[56,11,35,24,32,40,38],[37,37,54,52,47,10,22],[34,51,38,43,58,44]])

 #Costs - row is for Subcon and Columns is for Project

我正在尝试将上述内容转换为将Project / Subcontractor与其成本相结合的多字典,如下所示:

combination,cost = multidict({
    ('A','1'): 29,('A','2'): 49,'3'): 45,'4'): 55,'5'): 44,'6'): 49,'7'): 50,'8'): 45,'9'): 49}
)

解决方法

首先按照您想要的方式组合P和S。接下来使用zip转换为Zip。

import numpy as np

P = ['1','2','3','4','5','6','7','8','9'] #Projects
S = ['A','B','C','D','E','F'] #Subcontractors


C = np.array([[29,49,45,55,44,50,59],[46,57,59,56,30,34,42,36,49],[55,46,9,29,22,34],[56,11,35,24,32,40,38],[37,37,54,52,47,10,22],[34,51,38,43,58,44]])

final=[]
for s in S:
    temp=[]
    for p in P:
        temp.append(*zip(s,p))
    final.append(temp)

output=[dict(zip(x,c)) for c in C for x in final]           
print(output)

输出将是

[{('A','1'): 29,('A','2'): 49,'3'): 45,'4'): 55,'5'): 44,'6'): 49,'7'): 50,'8'): 45,'9'): 59},{('B',('B',{('C',('C',{('D',('D',{('E',('E',{('F',('F',{('A','1'): 46,'2'): 57,'3'): 59,'4'): 56,'5'): 30,'6'): 34,'7'): 42,'8'): 36,'9'): 49},'1'): 55,'2'): 42,'3'): 44,'4'): 46,'5'): 9,'7'): 29,'8'): 22,'9'): 34},'1'): 56,'2'): 55,'3'): 11,'4'): 35,'5'): 24,'6'): 32,'7'): 57,'8'): 40,'9'): 38},'1'): 37,'2'): 37,'3'): 54,'4'): 44,'5'): 22,'6'): 52,'7'): 47,'8'): 10,'9'): 22},'1'): 34,'2'): 51,'3'): 38,'4'): 34,'5'): 37,'6'): 43,'7'): 36,'8'): 58,'9'): 44},'9'): 44}]
,

使用dict-comprehension,您可以使用单线执行此操作:

from gurobipy import multidict
combination,cost = multidict({comb: c for comb,c in zip(((s,p) for p in P for s in S),C.ravel())})

其中

  • ((s,p) for p in P for s in S)创建组合元组
  • C.ravel()将视图返回到展平数组
  • zip()汇总了前两个可迭代项

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。