Python:索引列表列表的问题

时间:2015-11-20 10:44:56

标签: python list dictionary indexing

我有这个列表清单:

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

问题:是什么让我错过了列表中第三列中的所有值?

7 个答案:

答案 0 :(得分:3)

这是itertools.chain

的工作
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]1lst[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)

在你的情况下

  

len(array [0])= 4

  

len(array [0]) - 1 = 3

     

范围(3)= [0,1,2]

并且您只使用列表的一部分[ 1,2,4 ,8]

了解range

答案 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))