回答編集履歴
2
文章の軽微修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Python3 になるときに exec は構文から関数へ変更されました。それに併せて挙動が変更され
|
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
|
-
つまり、
|
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 を使った方法を追記
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
|
-
|
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
|
-
|
57
|
+
def main():
|
64
58
|
|
65
|
-
|
59
|
+
for i in fileinput.input():
|
66
60
|
|
61
|
+
a = i.strip()
|
62
|
+
|
67
|
-
|
63
|
+
print('a is', a)
|
68
64
|
|
69
65
|
|
70
66
|
|
71
|
-
|
67
|
+
d = {}
|
72
68
|
|
73
|
-
a
|
69
|
+
for i in range(0, int(a)):
|
74
70
|
|
75
|
-
|
71
|
+
d[i] = []
|
76
72
|
|
77
73
|
|
78
74
|
|
79
|
-
p
|
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(
|
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
|
+
```
|