回答編集履歴

2

文章の軽微修正

2017/07/07 04:59

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -1,4 +1,4 @@
1
- Python3 になるときに exec は構文から関数へ変更されました。それに併せて挙動が変更されています。※参考:[Issue 4831: exec() behavior - revisited - Python tracker](http://bugs.python.org/issue4831)
1
+ Python3 になるときに exec は構文から関数へ変更されました。それに併せて挙動が変更されたようです。※参考:[Issue 4831: exec() behavior - revisited - Python tracker](http://bugs.python.org/issue4831)
2
2
 
3
3
 
4
4
 
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- つまり、むりやり Python3 で動作させるにはこんなコードになります。
13
+ つまり、Python3 で動作させるにはこんなコードになります。
14
14
 
15
15
 
16
16
 
@@ -33,6 +33,10 @@
33
33
  main()
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ なんだかゴチャゴチャしてしまいました。
36
40
 
37
41
 
38
42
 
@@ -100,7 +104,7 @@
100
104
 
101
105
 
102
106
 
103
- さらに [defaultdict](http://docs.python.jp/3.3/library/collections.html#collections.defaultdict) を使えば最初初期化不要にるので、すっきりしたコードになります。
107
+ さらに [defaultdict](http://docs.python.jp/3.3/library/collections.html#collections.defaultdict) を使えばリスト定義自動やってくれようになるので、すっきりしたコードになります。
104
108
 
105
109
 
106
110
 

1

defaultdict を使った方法を追記

2017/07/07 04:58

投稿

miyahan
miyahan

スコア3095

test CHANGED
@@ -40,48 +40,104 @@
40
40
 
41
41
 
42
42
 
43
- そもそも **exec() や eval() はよほどの事がない限り使うべきではありません**。特に今回のような変数名を exec/eval で決定するような方法は避けるべきです。
43
+ そもそも **exec() や eval() はよほどの事がない限り使うべきではありません**。今回のように実装が複雑になったり、脆弱性の原因にもなります。特に今回のような変数名を exec/eval で決定するような方法は避けるべきです。
44
44
 
45
45
 
46
46
 
47
- 変数が不定・複数ある場合は素直に辞書を使いましょう。
47
+ 変数が不定・複数ある場合はリストや辞書を使いましょう。
48
48
 
49
49
 
50
50
 
51
51
  ```python
52
52
 
53
- def main():
53
+ import fileinput
54
-
55
- a = {}
56
-
57
- for i in range(0, 2):
58
-
59
- a[i] = []
60
54
 
61
55
 
62
56
 
63
- a[0].append('1')
57
+ def main():
64
58
 
65
- a[0].append('2')
59
+ for i in fileinput.input():
66
60
 
61
+ a = i.strip()
62
+
67
- a[0].append('3')
63
+ print('a is', a)
68
64
 
69
65
 
70
66
 
71
- a[1].append('4')
67
+ d = {}
72
68
 
73
- a[1].append('5')
69
+ for i in range(0, int(a)):
74
70
 
75
- a[1].append('6')
71
+ d[i] = []
76
72
 
77
73
 
78
74
 
79
- print(a[0])
75
+ d[0].append('1')
80
76
 
77
+ d[0].append('2')
78
+
79
+ d[0].append('3')
80
+
81
+
82
+
83
+ d[1].append('4')
84
+
85
+ d[1].append('5')
86
+
87
+ d[1].append('6')
88
+
89
+
90
+
91
+ print(d[0])
92
+
81
- print(a[1])
93
+ print(d[1])
82
94
 
83
95
 
84
96
 
85
97
  main()
86
98
 
87
99
  ```
100
+
101
+
102
+
103
+ さらに [defaultdict](http://docs.python.jp/3.3/library/collections.html#collections.defaultdict) を使えば最初の初期化を不要にできるので、すっきりしたコードになります。
104
+
105
+
106
+
107
+ ```python
108
+
109
+ from collections import defaultdict
110
+
111
+
112
+
113
+ def main():
114
+
115
+ d = defaultdict(list)
116
+
117
+
118
+
119
+ d[0].append('1')
120
+
121
+ d[0].append('2')
122
+
123
+ d[0].append('3')
124
+
125
+
126
+
127
+ d[1].append('4')
128
+
129
+ d[1].append('5')
130
+
131
+ d[1].append('6')
132
+
133
+
134
+
135
+ print(d[0])
136
+
137
+ print(d[1])
138
+
139
+
140
+
141
+ main()
142
+
143
+ ```