抱歉,我对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
答案 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个列表的大小,您应该使用zip
或izip
。
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])