web-dev-qa-db-ja.com

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ファイルからコピーする列のインデックスを含むリストです。問題は、シェルでコマンドを試すと動作するようですが、適切なサブリストに各値を追加する代わりにスクリプトを実行すると、すべての値がすべてのリストに追加されるため、2(またはそれ以上)同一のリスト。

45
clabacchio

Pythonリストは変更可能なオブジェクトであり、次のとおりです。

_plot_data = [[]] * len(positions) 
_

同じリストをlen(positions)回繰り返しています。

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

リスト内の各リストは、同じオブジェクトへの参照です。 1つを変更すると、すべての変更が表示されます。

別のリストが必要な場合は、次の方法で実行できます。

_plot_data = [[] for _ in positions]
_

例えば:

_>>> pd = [[] for _ in range(3)]
>>> pd
[[], [], []]
>>> pd[0].append(1)
>>> pd
[[1], [], []]
_
89
joaquin
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]]
2
eumiro