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

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

最佳答案

这可以使用 itertools.product 的组合(每个值的组合)来完成 WC,然后 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))

关于python - 如何将三个列表转换为字典,其中键取自前两个列表的笛卡尔积,值取自第三个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63053879/

相关文章:

python - 如何使用 Django REST Swagger 记录 pk 参数(或其他路径参数)?

python - 运行 '$x("XPath")' in Selenium ' driver.execute_script' JavaScript, chromedriver=111.0.5563.64

python - 在 Python 中将两个方法重写为一个方法

python - 计算嵌套列表python中的数据

python - 为什么 Python 允许解压空的可迭代对象?

Visual Studio 2017 中的 Python 无法通过搜索路径找到模块

python - 使用 pycrypto PKCS#7 创建签名

python - 在没有其他低级库的情况下使用 Python 监视文件系统事件

python - 在 open cv 中检测橙色的推荐颜色空间是什么?

python - 特殊方法,如 __str__ 返回对象的数字表示形式