Подтвердить что ты не робот

Добавление элементов в список списков в 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]]

Код, который я использую, следующий:

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. Проблема в том, что если я пытаюсь выполнить команды в оболочке, похоже, сработает, но если я запустил script вместо добавления каждого значения в соответствующий под-список, он добавит все значения ко всем спискам, поэтому я получаю 2 ( или более) идентичных списков.

4b9b3361

Ответ 1

Списки 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], [], []]

Ответ 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]]