回答編集履歴
3
サンプルコードをリファクタ
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
もし `data1` を初期化していないならば、`data1[0]`, `data1[1]` ... という要素は存在しないため、存在しないものに append() することはできません。
|
7
|
+
もし `data1` の中身を初期化していないならば、`data1[0]`, `data1[1]` ... という要素は存在しないため、存在しないものに append() することはできません。
|
8
8
|
|
9
9
|
|
10
10
|
|
@@ -18,9 +18,7 @@
|
|
18
18
|
|
19
19
|
data1 = []
|
20
20
|
|
21
|
-
r
|
21
|
+
for row in csv.reader(open(filename, 'r'), delimiter=' '):
|
22
|
-
|
23
|
-
for row in reader:
|
24
22
|
|
25
23
|
num += 1
|
26
24
|
|
@@ -34,7 +32,7 @@
|
|
34
32
|
|
35
33
|
|
36
34
|
|
37
|
-
if row[0]
|
35
|
+
if row[0] in ['ST', 'BA', 'DS']:
|
38
36
|
|
39
37
|
continue
|
40
38
|
|
@@ -88,9 +86,7 @@
|
|
88
86
|
|
89
87
|
data1 = OrderedDict()
|
90
88
|
|
91
|
-
r
|
89
|
+
for row in csv.reader(open(filename, 'r'), delimiter=' '):
|
92
|
-
|
93
|
-
for row in reader:
|
94
90
|
|
95
91
|
num += 1
|
96
92
|
|
@@ -104,7 +100,7 @@
|
|
104
100
|
|
105
101
|
|
106
102
|
|
107
|
-
if row[0]
|
103
|
+
if row[0] in ['ST', 'BA', 'DS']:
|
108
104
|
|
109
105
|
continue
|
110
106
|
|
@@ -114,7 +110,15 @@
|
|
114
110
|
|
115
111
|
else:
|
116
112
|
|
113
|
+
row_list = []
|
114
|
+
|
117
|
-
|
115
|
+
for i in range(0, 9):
|
116
|
+
|
117
|
+
row_list.append(int(row[i], 16))
|
118
|
+
|
119
|
+
row_list.append(row[10])
|
120
|
+
|
121
|
+
data1[num] = row_list
|
118
122
|
|
119
123
|
```
|
120
124
|
|
2
サンプルコードを辞書からOrderedDictに変更
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
IndexError
|
1
|
+
IndexError が起きているのは、csv.reader でデータを読み込んだ `row` リストではなく,
|
2
2
|
|
3
3
|
`data1` リストのようです。具体的には `data1[i].append(int(row[i],16))` の部分で起きています。
|
4
4
|
|
@@ -74,15 +74,19 @@
|
|
74
74
|
|
75
75
|
|
76
76
|
|
77
|
-
もし
|
77
|
+
もし `data1` をキーを前詰め(連番)ではなく元データの行番号にしたい場合は、リストではなくOrderedDictを使うとよいでしょう。
|
78
78
|
|
79
79
|
|
80
80
|
|
81
81
|
```python
|
82
82
|
|
83
|
+
from collections import OrderedDict
|
84
|
+
|
85
|
+
|
86
|
+
|
83
87
|
num = 0
|
84
88
|
|
85
|
-
data1 =
|
89
|
+
data1 = OrderedDict()
|
86
90
|
|
87
91
|
reader = csv.reader(open(filename, 'r'), delimiter=' ')
|
88
92
|
|
@@ -110,15 +114,7 @@
|
|
110
114
|
|
111
115
|
else:
|
112
116
|
|
113
|
-
row_list = []
|
114
|
-
|
115
|
-
for i in range(0, 9)
|
117
|
+
data1[num] = [int(row[i], 16) for i in range(0, 9)] + [row[10]]
|
116
|
-
|
117
|
-
row_list.append(int(row[i], 16))
|
118
|
-
|
119
|
-
row_list.append(row[10])
|
120
|
-
|
121
|
-
data1[num] = row_list
|
122
118
|
|
123
119
|
```
|
124
120
|
|
@@ -128,13 +124,13 @@
|
|
128
124
|
|
129
125
|
# 結果
|
130
126
|
|
131
|
-
|
127
|
+
OrderedDict([(1, [1951491306, 128, 0, 0, 0, 49, 0, 50, 0, '080159.008']),
|
132
128
|
|
133
|
-
3
|
129
|
+
(3, [1951491306, 0, 0, 56, 0, 0, 0, 0, 63, '080159.008']),
|
134
130
|
|
135
|
-
5
|
131
|
+
(5, [1951491307, 0, 0, 0, 35, 0, 36, 0, 0, '080159.008']),
|
136
132
|
|
137
|
-
6
|
133
|
+
(6, [1959240547, 191, 0, 0, 0, 63, 0, 59, 0, '080200.000'])])
|
138
134
|
|
139
135
|
```
|
140
136
|
|
1
内包表記について追記
test
CHANGED
@@ -4,11 +4,11 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
もし `data1` を初期化していないならば、`data1[0]`, `data1[1]` ... という要素は存在しないため、存在しないものに
|
7
|
+
もし `data1` を初期化していないならば、`data1[0]`, `data1[1]` ... という要素は存在しないため、存在しないものに append() することはできません。
|
8
8
|
|
9
9
|
|
10
10
|
|
11
|
-
|
11
|
+
`data1` リストに各列のデータを格納したリストを前詰めで入れていくなら、例えば次のようなコードにします。各列のデータを入れた row_list リストを data1 リストの末端に追加しています。つまりリストの中にリストを入れています。
|
12
12
|
|
13
13
|
|
14
14
|
|
@@ -74,7 +74,7 @@
|
|
74
74
|
|
75
75
|
|
76
76
|
|
77
|
-
もし、`data1`
|
77
|
+
もし、`data1` をキーを前詰めではなく元データの行番号にしたい場合は辞書を使うとよいでしょう。
|
78
78
|
|
79
79
|
|
80
80
|
|
@@ -144,4 +144,36 @@
|
|
144
144
|
|
145
145
|
|
146
146
|
|
147
|
+
なお `data1` にデータを追加するとき、Python の内包表記というテクニックを使うと、ちょっとかっこよく書けます。
|
148
|
+
|
149
|
+
|
150
|
+
|
151
|
+
```python
|
152
|
+
|
153
|
+
# before
|
154
|
+
|
155
|
+
row_list = []
|
156
|
+
|
157
|
+
for i in range(0, 9):
|
158
|
+
|
159
|
+
row_list.append(int(row[i], 16))
|
160
|
+
|
161
|
+
row_list.append(row[10])
|
162
|
+
|
163
|
+
data1.append(row_list)
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
# after
|
168
|
+
|
169
|
+
data1.append([int(row[i], 16) for i in range(0, 9)] + [row[10]])
|
170
|
+
|
171
|
+
```
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
---
|
176
|
+
|
177
|
+
|
178
|
+
|
147
|
-
ちなみに `num` をループの最後にカウントアップしていますが、continue したときにカウントアップしないため1000000個
|
179
|
+
ちなみに `num` をループの最後にカウントアップしていますが、continue したときにカウントアップしないため、目的のデータを1000000個取り込んだら終了という意味になります。もし元データの1000000行目で終了としたいのなら、上記に示したサンプルコードのように最初に `num += 1` してください。
|