2012-01-03 156 views
35

我生氣的列表索引,並不能解釋我做錯了什麼。將項目附加到列表中的Python列表

我有這樣一段代碼,其中我想創建列表的列表,每一個包含相同的電路參數(電壓,電流等)我是從一個文件csv看起來像讀取的值這個:

Sample, V1, I1, V2, I2 
0, 3, 0.01, 3, 0.02 
1, 3, 0.01, 3, 0.03 

依此類推。我想是創建,例如包含V1和I1名單(我要以交互方式選擇)的形式[V1],[I1],所以:

[[3,3], [0.01, 0.01]] 

是我的代碼基於M是這樣的:

plot_data = [[]]*len(positions)  
for row in reader: 
    for place in range(len(positions)): 
     value = float(row[positions[place]]) 
     plot_data[place].append(value) 

plot_data是一個包含所有值的列表,而positions是,我想從.csv文件複製列的索引列表。問題是,如果我在shell中嘗試命令,似乎工作,但如果我運行腳本而不是將每個值附加到正確的子列表,它將所有值附加到所有列表,所以我獲得2(或更多)相同的名單。

回答

72

Python的列表是可變的對象,在這裏:

plot_data = [[]] * len(positions) 

你重複相同的列表len(positions)倍。

>>> plot_data = [[]] * 3 
>>> plot_data 
[[], [], []] 
>>> plot_data[0].append(1) 
>>> plot_data 
[[1], [1], [1]] 
>>> 

列表中的每個列表都是對同一對象的引用。你修改一個,你會看到所有這些修改。

如果你想不同的列表,你可以這樣說:

plot_data = [[] for _ in positions] 

例如:

>>> pd = [[] for _ in range(3)] 
>>> pd 
[[], [], []] 
>>> pd[0].append(1) 
>>> pd 
[[1], [], []] 
+0

真棒!正是我在尋找 – Jay 2014-08-13 03:29:40

+1

有人對下劃線黑魔法有很好的解釋嗎?我相信它被用作[一次性變量](http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python),但我仍然不會不太明白這意味着什麼。 – 2015-07-28 02:27:05

+0

@AustinA你在鏈接的SO問題中從你選擇的答案中無法理解什麼? – joaquin 2015-07-29 08:06:58

2
import csv 
cols = [' V1', ' I1'] # define your columns here, check the spaces! 
data = [[] for col in cols] # this creates a list of **different** lists, not a list of pointers to the same list like you did in [[]]*len(positions) 
with open('data.csv', 'r') as f: 
    for rec in csv.DictReader(f): 
     for l, col in zip(data, cols): 
      l.append(float(rec[col])) 
print data 

# [[3.0, 3.0], [0.01, 0.01]] 
+0

沒錯,但是我需要選擇dinamically打印多少個以及要打印哪一組值......可以像許多一樣...... – clabacchio 2012-01-03 14:26:30

+0

@clabacchio - 更新了我的答案。現在它可以處理任何列的順序。 – eumiro 2012-01-03 14:29:59