为什么我不能这样迭代列表列表?

时间:2013-07-17 16:12:25

标签: python list loops

抱歉,我对python很新,但我需要获取6个单独的列表并将它们连接起来,使它们类似于列表列表。

即。来自列表B的列表A + b1中的a1和来自列表C的列表B + c1中的a1 和列表A + b2 ......等的a2

应该变成[[a1,b1,c1],[a2,b2,c2] ...]

我试过了:

combList = [[0]*6]*len(lengthList)

for i in range(len(lengthList)):
    print i
    combList[i][0] = posList[i]
    combList[i][1] = widthList[i]
    combList[i][2] = heightList[i]
    combList[i][3] = areaList[i]
    combList[i][4] = perimList[i]
    combList[i][5] = lengthList[i]
    # i++
print combList

然后尝试了一个变体,我附加了:

    for i in range(len(lengthList)):
        print i
        combList[i][0].append(posList[i])
        combList[i][1].append(widthList[i])
        combList[i][2].append(heightList[i])
        combList[i][3].append(areaList[i])
        combList[i][4].append(perimList[i])
        combList[i][5].append(lengthList[i])
        # i++
    print combList

所以我有两个问题。

为什么这些都不起作用,我认为应该有。我不需要把i ++放在右下角?由于某种原因它只是没有工作所以我只是麻烦射击。

我最终找到了一个解决方案,如下所示,但我只是想了解上面两个失败的代码中发生了什么。

for j in range(len(fNameList)):
            rows = [fNameList[j], widthList[j], heightList[j], areaList[j], perimeterList[j], lengthList[j]]
            print rows
            combList.append(rows)
        print combList

5 个答案:

答案 0 :(得分:4)

你遇到的问题是你正在创建一个包含同一事物的6个引用的列表。

[0]*6将生成一个包含相同数字(零)的6个引用的列表,[[0]*6]*len(lengthList)将生成对同一个[0]*6列表的引用列表。

我认为你想要的功能是zip

A = ['a1','a2','a3']
B = ['b1','b2','b3']
C = ['c1','c2','c3']

print [x for x in zip(A,B,C)]

给出:

[('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3')]

所以在你的情况下,这将起作用:

combList = [x for x in zip(fNameList, widthList, heightList, areaList, perimeterList, lengthList)]

答案 1 :(得分:3)

当你这样做时,你正在列出names所有指向同一个六个零的列表:

combList = [[0]*6]*len(lengthList)

这相当于这样做:

internal_list = [0] * 6
combList = [internal_list, internal_list, internal_list, internal_list, internal_list]

相反,如果您使用zip,您可以一次性获得所需内容:

zipped_list = zip(posList, widthList, heightList, areaList, perimList, lengthList)

答案 2 :(得分:3)

a = [0]*6定义了一个包含6个引用的列表,所有这些引用都指向数字0

[a]*m定义了一个包含m引用的列表,所有引用都指向a,在本例中为[0]*6

最后一个示例中的代码有效,因为它添加了对新对象的引用,而不是重复修改现有对象。

其他人建议你使用zip,这确实是最好的解决方案,恕我直言。

答案 3 :(得分:1)

如果列表长度相同,你可以通过拉链理解这一点

[list(tup) for tup in zip (l1, l2, l3...)]

答案 4 :(得分:1)

根据Python的版本以及3个列表的大小,您应该使用zipizip

izip如果您正在运行Python< 3(您也可以使用zip但如果列表非常大,那么生成器将更快,更好地为您完成堆。)

zip如果您正在运行Python> = 3

from itertools import izip

zipped_list = izip(a,b,c)

for item in zipped_list:
    print item
>> (1, 1, 1)
>> (2, 2, 2)
>> (3, 3, 3)
>> (4, 4, 4)
>> (5, 5, 5)

只是为了补充如何编写干净整洁的Python:

你已完成的循环for i in range(len(lengthList)可以很容易地变成什么样的Pythonic。

for item in lengthList:

现在你正在考虑“我的索引怎么样,我无法访问元素的索引”。 好的Python也有一个修复,它被称为enumerate,你就像这样使用它:

for index, item in enumerate(lengthlist):

因此,将代码转换为更多Pythonic语法:

for index, element in enumerate(lengthList):
    combList[index][0].append(posList[index])
    combList[index][1].append(widthList[index])
    combList[index][2].append(heightList[index])
    combList[index][3].append(areaList[index])
    combList[index][4].append(perimList[index])
    combList[index][5].append(lengthList[index])