2013-07-17 29 views
1

對不起,我對python相當陌生,但我需要將6個單獨的列表連接起來,使它們類似於列表列表。爲什麼我不能通過這種方式迭代列表清單?

即A1從列表A +從列表B + C1由C b1和從列表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 

所以我有兩個問題。

爲什麼沒有這些工作,我認爲他們應該有的CUS。我不需要把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

在你做的問題是,你正在創建一個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)] 
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) 
+0

我明白了!非常感謝。從來不知道python的「名稱」,我認爲zip只是將2個列表與元組結合起來,但現在我知道了。 – loonyuni

3

a = [0]*6定義了6列表所有參考文獻指向編號0

[a]*m定義了一個帶有m參考的列表,全部指向a,在這種情況下爲[0]*6

最終示例中的代碼工作原因是它添加了對新對象的引用,而不是反覆修改現有對象。

其他人推薦您使用zip,這的確是最好的解決辦法,恕我直言。

1

你可以跨越一個zip一個修真做到這一點,如果列表都是相同的長度

[list(tup) for tup in zip (l1, l2, l3...)] 
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): 

所以翻譯你的代碼到一個更Python語法:

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]) 
相關問題