如何从 Python 中的 3 个列表创建 3 维字典
How to create a 3 dimensional dictionary from 3 lists in Python
我有 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, j
和 l
并执行 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
中编写线性程序,我想在 l
期间 j
期间为特定 sku i
创建一个需求值字典,以便我可以对 i
、j
、l
进行 Dijl*Xijtl = some_value
求和以获得约束或类似的东西。这些需求值是常数。这可能是笛卡尔积或理解。有没有类似LpVariable.dicts()
的功能?
如果你想要 "Cartesian product" 个列表,你可以使用:
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': ''}}}
这是一个使用 product
and setdefault
的变体:
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
作为您的值的占位符。
另一种方法是使用一个由元组值作为键的字典,即
D ={}
for i in I:
for j in J:
for k in K:
D[i,j,k] = your value
请注意 pulp
更常见的做法是用大写字母捐赠您的作品集,然后用较小的字母进行迭代。
我认为这作为理解读起来非常好:
D = {i_: {j_: {l_: "value" for l_ in l} for j_ in j} for i_ in i}
由于您使用的是 PuLP,因此您可能需要查看 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)
我有 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, j
和 l
并执行 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
中编写线性程序,我想在 l
期间 j
期间为特定 sku i
创建一个需求值字典,以便我可以对 i
、j
、l
进行 Dijl*Xijtl = some_value
求和以获得约束或类似的东西。这些需求值是常数。这可能是笛卡尔积或理解。有没有类似LpVariable.dicts()
的功能?
如果你想要 "Cartesian product" 个列表,你可以使用:
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': ''}}}
这是一个使用 product
and setdefault
的变体:
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
作为您的值的占位符。
另一种方法是使用一个由元组值作为键的字典,即
D ={}
for i in I:
for j in J:
for k in K:
D[i,j,k] = your value
请注意 pulp
更常见的做法是用大写字母捐赠您的作品集,然后用较小的字母进行迭代。
我认为这作为理解读起来非常好:
D = {i_: {j_: {l_: "value" for l_ in l} for j_ in j} for i_ in i}
由于您使用的是 PuLP,因此您可能需要查看 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)