【问题标题】:How to create a 3 dimensional dictionary from 3 lists in Python如何在 Python 中从 3 个列表创建 3 维字典
【发布时间】:2017-11-15 14:09:34
【问题描述】:

我有 3 个列表

i = ['a','b','c']
j = ['1','2','3']
l = ['01','02']

我想创建一个看起来像这样的字典:

D = {'a':{'1':{'01':10, '02':100}, {'2':{'01':20,'02':50}}}

我希望能够遍历 i, jl 并执行 D[i][j][l] 以获取与其关联的值。

Ds = {}
l_ = 0
for i_ in range(len(i)):
    j_ = 0
    for j_ in range(len(j)):
        l_ = 0
        for l_ in range(len(l)): 
            Ds[i[i_]] = {j[j_]:{l[l_]:'some value'}}

我试过这个,但这不起作用。

额外: 我正在Pulp 中编写一个线性程序,我想在j 在线l 上为特定sku i 创建一个需求值字典,这样我就可以对Dijl*Xijtl = some_value 求和@987654334 @,jl 用于约束或类似的东西。这些需求值是常数。这可能是笛卡尔积或理解。有没有类似LpVariable.dicts()的功能?

【问题讨论】:

标签: python python-3.x pulp


【解决方案1】:

如果你想要列表的“笛卡尔积”,你可以使用:

i = ['a','b','c']
j = ['1','2','3']
l = ['01','02']

Ds = {}

for i_ in i:
    item_i = {}
    for j_ in j:
        item_j = {}
        for l_ in l:
            item_j[l_] = '' # Your value                                                                                                                      
        item_i[j_] = item_j
    Ds[i_] = item_i

print Ds
# {'a': {'1': {'02': '', '01': ''}, '3': {'02': '', '01': ''}, '2': {'02': '', '01': ''}}, 'c': {'1': {'02': '', '01': ''}, '3': {'02': '', '01': ''}, '2': {'02': '', '01': ''}}, 'b': {'1': {'02': '', '01': ''}, '3': {'02': '', '01': ''}, '2': {'02': '', '01': ''}}}

【讨论】:

  • 这就是我要找的。不知道它叫笛卡尔积。
【解决方案2】:

这是使用productsetdefault 的变体:

from itertools import product

D = {}
for ii, jj, ll in product(i, j, l):
    D.setdefault(ii, {})
    D[ii].setdefault(jj, {})
    D[ii][jj][ll] = None

我使用None 作为您价值的占位符。

【讨论】:

    【解决方案3】:

    另一种方法是拥有一个由元组值作为键的字典,即

    D ={}
    for i in I:
       for j in J:
          for k in K:
             D[i,j,k] = your value
    

    pulp 中请注意,更常见的做法是用大写字母捐赠您的集合并用较小的字母进行迭代。

    【讨论】:

      【解决方案4】:

      我认为这是一种很好的理解:

      D = {i_: {j_: {l_: "value" for l_ in l} for j_ in j} for i_ in i}
      

      【讨论】:

        【解决方案5】:

        由于您使用的是 PuLP,您可能需要研究一下纸浆的 makeDict()。

        假设你有以下:

        i = ['a', 'b']
        j = ['1', '2', '3']
        l = ['01', '02']
        

        对于您的需求值,您拥有:

        value_a_1_01 = 10
        value_a_1_02 = 20
        value_a_2_01 = 30
        value_a_2_02 = 40
        value_a_3_01 = 50
        value_a_3_02 = 60
        
        value_b_1_01 = 70
        value_b_1_02 = 80
        value_b_2_01 = 90
        value_b_2_02 = 100
        value_b_3_01 = 110
        value_b_3_02 = 120
        

        然后您可以创建一个包含您的需求数据的数组,如下所示:

        array = [[{'01': 10, '02': 20}, {'01': 30, '02': 40},
                  {'01': 50, '02': 60}],
                 [{'01': 70, '02': 80}, {'01': 90, '02': 100},
                  {'01': 110, '02': 120}]]
        

        现在定义你的字典:

        D = pulp.makeDict([i, j], array)
        

        编辑:由于之前设置的数据有点乱,这样设置数组会更干净(也更容易编辑):

        array = [
                 [[10, 20], [30, 40], [50, 60]], 
                 [[70, 80], [90, 100], [110, 120]]
                ]
        

        现在 makeDict() 的参数应该是:

         D = pulp.makeDict([i, j, l], array)
        

        【讨论】:

        • 我在寻找类似于LpVariable.dicts() 的东西。太棒了。谢谢!
        • 我将对此进行编辑,因为使用 makeDict() 的方式更加简洁。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多