2012-01-03 9 views
35

Tôi phát điên với các chỉ mục danh sách và không thể giải thích những gì tôi đang làm sai.Bổ sung các mục vào danh sách các danh sách trong python

Tôi có đoạn mã mà tôi muốn tạo danh sách các danh sách, mỗi danh sách chứa các giá trị của cùng tham số mạch (điện áp, dòng hiện tại, v.v ..) mà tôi đang đọc từ tệp csv trông giống như này:

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

Và cứ tiếp tục như vậy. Những gì tôi muốn là tạo ra một danh sách đó ví dụ chứa V1 và I1 (nhưng tôi muốn chọn một cách tương tác) theo hình thức [[V1], [I1]], vì vậy:

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

Mã mà tôi đang sử dụng là:

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 là danh sách có chứa tất cả các giá trị, trong khi positions là một danh sách với các chỉ số của các cột mà tôi muốn sao chép từ các tập tin .csv. Vấn đề là nếu tôi thử các lệnh trong trình bao, dường như hoạt động, nhưng nếu tôi chạy tập lệnh thay vì gắn thêm mỗi giá trị vào danh sách con thích hợp, nó sẽ nối tất cả các giá trị vào tất cả các danh sách, vì vậy tôi nhận được 2 (hoặc nhiều hơn) danh sách giống hệt nhau.

Trả lời

72

danh sách Python là những đối tượng có thể thay đổi và ở đây:

plot_data = [[]] * len(positions) 

bạn đang lặp đi lặp lại cùng một danh sách len(positions) lần.

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

Mỗi danh sách trong danh sách của bạn là tham chiếu đến cùng một đối tượng. Bạn sửa đổi một, bạn thấy sự sửa đổi trong tất cả chúng.

Nếu bạn muốn danh sách khác nhau, bạn có thể làm theo cách này:

plot_data = [[] for _ in positions] 

ví dụ:

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

Awesome! Chỉ cần những gì tôi đang tìm kiếm – Jay

+1

Có ai đó có một lời giải thích tốt về ma thuật đen gạch dưới? Tôi tin rằng nó đang được sử dụng như là một [biến throwaway] (http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python) nhưng tôi vẫn không không hiểu điều đó có nghĩa là gì. –

+0

@AustinA chính xác những gì bạn không hiểu từ câu trả lời được chọn trong câu hỏi SO bạn liên kết? – joaquin

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

đúng, nhưng tôi cần phải chọn thực tế bao nhiêu và bộ giá trị nào để in ... có thể là một số giống như nhiều ... – clabacchio

+0

@clabacchio - cập nhật câu trả lời của tôi. Bây giờ nó hoạt động với bất kỳ thứ tự các cột nào. – eumiro