1

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

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

应该变成 [[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
4

5 回答 5

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)]
于 2013-07-17T16:14:44.520 回答
3

当您这样做时,您正在制作一个名称列表,它们都指向同一个六个零列表:

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)
于 2013-07-17T16:15:12.337 回答
3

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

[a]*m定义了一个带有m引用的列表,所有引用都指向a,在这种情况下[0]*6

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

其他人推荐你使用zip,它确实是最好的解决方案,恕我直言。

于 2013-07-17T16:15:37.820 回答
1

如果列表长度相同,您可以通过对 zip 的理解来做到这一点

[list(tup) for tup in zip (l1, l2, l3...)]
于 2013-07-17T16:18:36.717 回答
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])
于 2013-07-17T17:06:56.717 回答