teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

ジェネレータ例追加

2019/12/28 06:32

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -1,3 +1,15 @@
1
+ itertools.product同様にジェネレータにすればメモリ使用量は減ります。
2
+
3
+ ```
4
+ def bit_pattern(n):
5
+ for i in range(2**n):
6
+ yield [(i >> b) & 1 for b in range(n - 1, -1, -1)]
7
+
8
+ M = 10
9
+ for bit in bit_pattern(M):
10
+ print(bit)
11
+ ```
12
+
1
13
  処理内容によっては、バイナリのままrangeにしておいて、必要なときに2進配列化する手もあるのでは?
2
14
  itertool.product で処理した方が高速ですけど。
3
15
 
@@ -5,7 +17,7 @@
5
17
  >>> M = 10
6
18
  >>> pattern = range(1<<M)
7
19
  >>> def to_array(b, n):
8
- ... return [(b >> (i - 1)) & 1 for i in range(n, 0, -1)]
20
+ ... return [(i >> b) & 1 for b in range(n - 1, -1, -1)]
9
21
  ...
10
22
  >>> print(to_array(pattern[5], M))
11
23
  [0, 0, 0, 0, 0, 0, 0, 1, 0, 1]

5

例変更

2019/12/28 06:32

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -3,11 +3,11 @@
3
3
 
4
4
  ```
5
5
  >>> M = 10
6
- >>> pattern = range(2**M)
6
+ >>> pattern = range(1<<M)
7
- >>> formatter = f"{{:0{M}b}}".format
7
+ >>> def to_array(b, n):
8
+ ... return [(b >> (i - 1)) & 1 for i in range(n, 0, -1)]
9
+ ...
8
- >>> print(formatter(pattern[5]))
10
+ >>> print(to_array(pattern[5], M))
9
- 0000000101
10
- >>> print([*map(int, formatter(pattern[5]))])
11
11
  [0, 0, 0, 0, 0, 0, 0, 1, 0, 1]
12
12
  ```
13
13
 

4

補足追加

2019/12/28 05:59

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -1,4 +1,5 @@
1
1
  処理内容によっては、バイナリのままrangeにしておいて、必要なときに2進配列化する手もあるのでは?
2
+ itertool.product で処理した方が高速ですけど。
2
3
 
3
4
  ```
4
5
  >>> M = 10

3

出力追加

2019/12/27 23:06

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -18,6 +18,8 @@
18
18
  ... print(f"{i:0{M}b}")
19
19
  ...
20
20
  0000000000
21
+ 0000000001
21
22
  ...
23
+ 1111111110
22
24
  1111111111
23
25
  ```

2

使用例追加

2019/12/27 23:01

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -8,4 +8,16 @@
8
8
  0000000101
9
9
  >>> print([*map(int, formatter(pattern[5]))])
10
10
  [0, 0, 0, 0, 0, 0, 0, 1, 0, 1]
11
+ ```
12
+
13
+ とか
14
+
15
+ ```
16
+ >>> M = 10
17
+ >>> for i in range(2**M):
18
+ ... print(f"{i:0{M}b}")
19
+ ...
20
+ 0000000000
21
+ ...
22
+ 1111111111
11
23
  ```

1

別案

2019/12/27 23:00

投稿

shiracamus
shiracamus

スコア5406

answer CHANGED
@@ -1,4 +1,4 @@
1
- バイナリのままrangeにしておいて、必要なときに2進配列化する手もあるのでは?
1
+ 処理内容によっては、バイナリのままrangeにしておいて、必要なときに2進配列化する手もあるのでは?
2
2
 
3
3
  ```
4
4
  >>> M = 10