回答編集履歴

3

サンプルコードをリファクタ

2017/08/23 14:30

投稿

miyahan
miyahan

スコア3095

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
- reader = csv.reader(open(filename, 'r'), delimiter=' ')
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] == "ST" or row[0] == "BA" or row[0] == "DS":
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
- reader = csv.reader(open(filename, 'r'), delimiter=' ')
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] == "ST" or row[0] == "BA" or row[0] == "DS":
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
- data1[num] = [int(row[i], 16) for i in range(0, 9)] + [row[10]]
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に変更

2017/08/23 14:30

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -1,4 +1,4 @@
1
- IndexError エラーが起きているのは、csv.reader でデータを読み込んだ `row` リストではなく,
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
- もし`data1` をキーを前詰めではなく元データの行番号にしたい場合は辞書を使うとよいでしょう。
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
- {1: [1951491306, 128, 0, 0, 0, 49, 0, 50, 0, '080159.008'],
127
+ OrderedDict([(1, [1951491306, 128, 0, 0, 0, 49, 0, 50, 0, '080159.008']),
132
128
 
133
- 3: [1951491306, 0, 0, 56, 0, 0, 0, 0, 63, '080159.008'],
129
+ (3, [1951491306, 0, 0, 56, 0, 0, 0, 0, 63, '080159.008']),
134
130
 
135
- 5: [1951491307, 0, 0, 0, 35, 0, 36, 0, 0, '080159.008'],
131
+ (5, [1951491307, 0, 0, 0, 35, 0, 36, 0, 0, '080159.008']),
136
132
 
137
- 6: [1959240547, 191, 0, 0, 0, 63, 0, 59, 0, '080200.000']}
133
+ (6, [1959240547, 191, 0, 0, 0, 63, 0, 59, 0, '080200.000'])])
138
134
 
139
135
  ```
140
136
 

1

内包表記について追記

2017/08/23 14:24

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -4,11 +4,11 @@
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
 
11
- もし `data1` リストにデータリストを順に入れていくなら、例えば次のようなコードにします。各列のデータを入れた row_list リストを data1 リストの末端に追加しています。
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個の対象データを取り込んだら終了という意味になります。もし1000000行目で終了としたいのなら、上記に示したサンプルコードのように最初に `num += 1` してください。
179
+ ちなみに `num` をループの最後にカウントアップしていますが、continue したときにカウントアップしないため、目的のデータを1000000個取り込んだら終了という意味になります。もし元データの1000000行目で終了としたいのなら、上記に示したサンプルコードのように最初に `num += 1` してください。