如何解决有没有办法将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 举报,一经查实,本站将立刻删除。