0

.csvファイルを読み込んで、float値の2次元配列を作成しようとしています。これは私がこれまでに行ったことです:

import csv
filename  = 'data_out.csv'   
# create an array for the for the data    
row_values = [None]*len(header)   
all_values = []

reader = csv.reader(open(filename,'rt'),delimiter=',')
next(reader) #skip header line
for row in reader:
    i=0
    for item in row:
        value = float(item)
        row_values[i]=value
        i=i+1
        print(row_values)
    all_values.append(row_values)

print(all_values)

印刷(row_values)は機能しているように見えます。各行はfloat値のリストに入れられます。しかし、(all_values)を出力すると、機能しません。リストのリスト(正しい行数)を作成しましたが、これは値の最後の行だけが何度も繰り返されています。おそらく私は間違った場所に.append()を持っていますか?

Pythonでプログラミングするのはこれが初めてですが、C++でプログラミングして何年も経っています。ヘルプ/ヒントをいただければ幸いです。ありがとうございました!

4

2 に答える 2

1

配列オブジェクトを1つだけ作成し、同じ配列オブジェクトをリストに追加します。したがって、最後の行のみが最終出力で繰り返されます。

第1レベルのループ内に配列オブジェクトを作成し、それをリストに追加する必要があります。

于 2013-02-22T09:06:51.600 に答える
1

問題は、コピーではなく、配列を追加するたびに配列への参照all_valuesを格納することです。したがって、のすべての要素は同じ配列を指す参照であり、その値は各反復で値を上書きします。row_valuesall_valuesrow_values

たとえば、これを参照してください。

b = []

a = [1, 2]
b.append(a)
print b

a[0] = 3
b.append(a)
print b

print id(b[0]), id(b[1])

これはプログラムと同じ効果があり[[3, 2], [3, 2]]、2番目のprintステートメントに対して出力されます。最後のprintステートメントは、の両方の値のIDを示していますb。これは同じです。つまり、bの2つの要素は同じ要素です。

したがって、ループの固定(およびよりPythonic)バージョンは次のようになります。

reader = csv.reader(open(filename,'rt'),delimiter=',')
for row in reader:
    row_values = [float(item) for item in row]
    all_values.append(row_values)

print all_values

3行目は、リスト内包表記を使用して、のすべての値rowをfloatに変換し、それらを新しい配列に格納してから、に追加しall_valuesます。

于 2013-02-22T09:07:03.197 に答える