我有这个列表清单:
mylist=[[1, 2, 4, 8], [16, 32, 64, 128], [256, 512, 1024, 2048]]
现在我想创建一个字典,为每个键分配列表中相应索引的值。
在这种情况下:correct_dict={0:1,1:2,2:4,3:8,4:16,...,11:2048}
。
我打算用以下功能来做:
def dictionarize3(array):
dict3={}
count_var=0
for i in range(len(array[0]) - 1) :
for j in range(len(array[0]) - 1):
dict3[count_var]=array[i][j]
count_var=count_var+1
return dict3
dict=dictionarize3(mylist)
但这就是我得到的:
wrong_dict={0: 1, 1: 2, 2: 4, 3: 16, 4: 32, 5: 64, 6: 256, 7: 512, 8: 1024}
。
所以,len(correct_dict)=12
,而len(wrong_dict)=9
。
问题:是什么让我错过了列表中第三列中的所有值?
答案 0 :(得分:3)
from itertools import chain
mylist=[[1, 2, 4, 8], [16, 32, 64, 128], [256, 512, 1024, 2048]]
mydict = {i:v for i,v in enumerate(chain(*mylist))}
print(mydict)
输出:
{0: 1, 1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048}
问题:是什么让我想念列表中的所有值 位于第三栏?
range(len(array[0]) - 1)
是在其参数之前结束1的范围;因此在你的情况下,一个在4 - 1 = 3之前,因此在索引2,它跳过内部索引3的最后一个元素。
修改强> 而那个外循环
for i in range(len(array[0]) - 1) :
似乎是巧合,因为外部列表的长度为。 你需要的是这个:
for i in range(len(array)):
你的"我"是整个外部数组,而不是它的第一个内部元素! :)
答案 1 :(得分:2)
这是dictionarize3函数的修正版本:
def dictionarize3(array):
dict3={}
count_var=0
for i in range(len(array)) :
for j in range(len(array[i])):
dict3[count_var]=array[i][j]
count_var=count_var+1
return dict3
您没有引用正确的部分。当试图找到整个数组的长度时,你发现了一个内部数组的长度,只是一个逻辑错误。
EDIT 正如decltype_auto所指出的那样,拥有一个额外的迭代变量并不是惯用的,该变量执行与for循环中已声明的函数相同的函数。我的回答很快,以至于我没有发现它!有替代和更有效的代码:
def dictionarize3(array):
dict3={}
for i in range(len(array)) :
for j in range(len(array[i])):
dict3[j]=array[i][j]
return dict3
答案 2 :(得分:2)
此处dict
似乎非常不合适。一个简单的平面列表会给你相同的实际结果:
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048]
此处lst[0]
为1
,lst[11]
为2048
。
您可以像这样展平列表:
lst = []
for l in mylist:
lst.extend(l)
或:
from itertools import chain
lst = chain(*mylist) # list(chain(*mylist)) if you don't want an iterator
答案 3 :(得分:2)
答案 4 :(得分:0)
dict理解和函数式编程风格的简单任务:
>>> mylist=[[1, 2, 4, 8], [16, 32, 64, 128], [256, 512, 1024, 2048]]
>>> correct_dict = {k:v for k, v in enumerate(reduce(lambda x,y: x+y, mylist))}
>>> correct_dict
{0: 1, 1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048}
解释,你获取列表,将其减少到包含所有值的单个列表,用相应的索引枚举它,并使dict理解将索引作为键,列表号作为值。
答案 5 :(得分:0)
如果每个列表具有相同的长度,您可以这样做:
d = dict((i1*4+i2, x) for i1, y in enumerate(mylist) for i2, x in enumerate(y))
答案 6 :(得分:0)
>>> mylist=[[1, 2, 4, 8], [16, 32, 64, 128], [256, 512, 1024, 2048]]
>>> l = []
>>> for i in mylist:
l.extend(i)
>>> dict(zip(range(len(l)), l))