Python:索引列表的问题

Python:索引列表的问题,python,list,dictionary,indexing,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

我有以下清单:

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)
但我得到的是: 错误的dict={0:1,1:2,2:4,3:16,4:32,5:64,6:256,7:512,8:1024}

所以,lencorrect\u dict=12,而lencorrect\u dict=9


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

以下是函数字典3的更正版本:

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
你没有引用正确的部分。当你试图找到整个数组的长度时,你找到了数组中一个he的长度,这只是一个逻辑错误

正如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

下面是函数字典3的更正版本:

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
你没有引用正确的部分。当你试图找到整个数组的长度时,你找到了数组中一个he的长度,这只是一个逻辑错误

正如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

简单的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理解。

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理解。

如果每个列表的长度相同,您可以这样做:

d = dict((i1*4+i2, x) for i1, y in enumerate(mylist) for i2, x in enumerate(y))

如果每个列表的长度相同,您可以这样做:

d = dict((i1*4+i2, x) for i1, y in enumerate(mylist) for i2, x in enumerate(y))
口述在这里似乎很不合适。一个简单的平面列表将给您相同的实际结果:

[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)
或:

口述在这里似乎很不合适。一个简单的平面列表将给您相同的实际结果:

[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)
或:

就你而言

lenarray[0]=4

之后

透镜阵列[0]-1=3

范围3=[0,1,2]

您只处理列表[1,2,4,8]的一部分

阅读您的案例中的

lenarray[0]=4

之后

透镜阵列[0]-1=3

范围3=[0,1,2]

您只处理列表[1,2,4,8]的一部分

阅读有关

这是一份

输出:

{0: 1, 1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048}
问题:是什么让我错过了列表中的所有值 位于第三列

是在其参数前以1结尾的范围;因此,在你的例子中,4-1=3之前的一个,在索引2中,它跳过了最后一个元素的内部索引3

编辑 那外环呢

for i in range(len(array[0]) - 1) :
似乎是巧合,因为外部列表的长度为3。 您需要的是:

for i in range(len(array)):
你的i代表整个外部阵列,而不是第一个内部元素!:

这是我的工作

输出:

{0: 1, 1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048}
问题:是什么让我错过了列表中的所有值 位于第三列

是在其参数前以1结尾的范围;因此,在你的例子中,4-1=3之前的一个,在索引2中,它跳过了最后一个元素的内部索引3

编辑 那外环呢

for i in range(len(array[0]) - 1) :
似乎是巧合,因为外部列表的长度为3。 您需要的是:

for i in range(len(array)):

你的i代表整个外部阵列,而不是第一个内部元素!:

rangelenarray[0]-1=>range3,即->[0,1,2]。所以你错过了最后一个元素是的,但是如果我去掉-1,我会得到一个索引外错误。为什么是dict呢?如果简单地展平列表,您将得到一个具有完全相同的索引和值的列表。例如,itertools.chain*mylist.将来,想一想口述理解:{i:v代表mylist中的lst代表i,v代表enumeratelst}。@FrancescoCastellani:这是一个很好的读物。rangelenarray[0]-1=>range3,它是->[0,1,2]。所以你错过了最后一个元素是的,但是如果我去掉-1,我会得到一个索引外错误。为什么是dict呢?如果简单地展平列表,您将得到一个具有完全相同的索引和值的列表。例如,itertools.chain*mylist.将来,想一想口述理解:{i:v代表mylist中的lst代表
i、 v在enumeratelst}@FrancescoCastellani:这本书读得很好,很管用。为什么j需要达到比i更高的指数?为什么我不能同时使用lenarray[0]呢?我试了一下,发现了一个索引错误。但为什么?是因为我的列表就像一个3x4矩阵吗?那么,这两个长度是不同的?是这样吗?你为什么要进一步缩进?“这不应该和第一个一样吗?”@FrancescoCastellani,我的错,现在解决它。@R.Murray好的,你回答了这个问题——毫无疑问。但是我可以建议你在你的答案中添加我的替代代码吗?这是给我的。。对于j来说,在问题中加上一个计数器显然不是惯用语。这很有效。为什么j需要达到比i更高的指数?为什么我不能同时使用lenarray[0]呢?我试了一下,发现了一个索引错误。但为什么?是因为我的列表就像一个3x4矩阵吗?那么,这两个长度是不同的?是这样吗?你为什么要进一步缩进?“这不应该和第一个一样吗?”@FrancescoCastellani,我的错,现在解决它。@R.Murray好的,你回答了这个问题——毫无疑问。但是我可以建议你在你的答案中添加我的替代代码吗?这是给我的。。对于问题中带有附加计数器的j,显然不是惯用用法。请使用functools.reduce代替functools.reduce