2012-01-03 25 views
35

私はリストのインデックスに怒っているし、私が間違っていることを説明することはできません。Pythonのリストのリストに項目を追加する

私はリストのリストを作成するコードのこの部分を持って、私がどのように見えるcsvファイルから読んでいる同じ回路パラメータ(現在等。電圧)の値を含む各1これは:

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使用はこれです:positions私は.csvファイルからコピーしたい列のインデックスを持つリストである一方、

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は、すべての値を含むリストです。問題は、シェルでコマンドを実行しようとするとうまくいくようですが、適切なサブリストに各値を追加する代わりにスクリプトを実行すると、すべての値がすべてのリストに追加されるため、2(またはそれ以上)同一のリスト。あなたはlen(positions)回同じリストを繰り返している

plot_data = [[]] * len(positions) 

答えて

72

Pythonのリストは変更可能なオブジェクトとここにあります。

>>> 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], [], []] 
+0

恐ろしいあなたが異なるリストを使用する場合は

は、あなたがこの方法を行うことができます!ちょうど私が探していたもの – Jay

+1

誰かがアンダースコアの黒い魔法の良い説明をしていますか?私はそれが[投棄変数](http://stackoverflow.com/questions/5893163/what-is-the-purpose-of-the-single-underscore-variable-in-python)として使用されていると信じていますが、私はまだドンそれがどういう意味か分かりません。 –

+0

@AustinAあなたがリンクしている質問の中で、選択された答えから正確にわからないことは何ですか? – 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

右、しかし、私はdinamicallyいくつの値のセットを印刷するために選択する必要があります...多くのように1つになることができます... – clabacchio

+0

@clabacchio - 私の答えを更新しました。これで、任意の順序で動作します。 – eumiro

関連する問題