是否有更简洁的方法来遍历所有二进制4元组?

时间:2015-08-30 02:19:26

标签: python

这就是我想要它做的事情:

import itertools
list(itertools.product(*[[0,1]]*4))

输出:

[(0, 0, 0, 0),
 (0, 0, 0, 1),
 (0, 0, 1, 0),
 (0, 0, 1, 1),
 (0, 1, 0, 0),
 (0, 1, 0, 1),
 (0, 1, 1, 0),
 (0, 1, 1, 1),
 (1, 0, 0, 0),
 (1, 0, 0, 1),
 (1, 0, 1, 0),
 (1, 0, 1, 1),
 (1, 1, 0, 0),
 (1, 1, 0, 1),
 (1, 1, 1, 0),
 (1, 1, 1, 1)]

但它对我有点混淆。有更多的pythonic方法吗?

4 个答案:

答案 0 :(得分:6)

z-index: -5采用itertools.product参数,这简化了一点,因为它避免了参数解包并因此避免了列表乘法:

repeat

这甚至在official documentation 1 中被调用(尽管该示例使用itertools.product(range(2), repeat=4) )。

1 注意,我使用的是repeat=3而不是range(2)(0, 1),因为这就是它在文档中的编写方式。无论哪种方式都可行:)(显然)

答案 1 :(得分:3)

嗯,就是这样:

[0, 1]

输出:

import itertools
list(itertools.product((0, 1), repeat=4))

不能比那简单得多:)。

答案 2 :(得分:1)

如果它清晰你之后:

file_ID_doublearr = flipud(file_ID_doublearr); 

如果你不喜欢嵌套但是喜欢列表理解:

for  a in range(2):
  for b in range(2):
    for c in range(2):
      for d in range(2):
        tup = (a,b,c,d)
        print(tup)

如果你想强调二进制

[ (d,c,b,a) for d in range(2) for c in range(2) for b in range(2) for a in range(2) ]

答案 3 :(得分:0)

另一种方式:

>>> [tuple(format(x,'04b')) for x in range(16)]
[('0', '0', '0', '0'), ('0', '0', '0', '1'), ('0', '0', '1', '0'), ('0', '0', '1', '1'), ('0', '1', '0', '0'), ('0', '1', '0', '1'), ('0', '1', '1', '0'), ('0', '1', '1', '1'), ('1', '0', '0', '0'), ('1', '0', '0', '1'), ('1', '0', '1', '0'), ('1', '0', '1', '1'), ('1', '1', '0', '0'), ('1', '1', '0', '1'), ('1', '1', '1', '0'), ('1', '1', '1', '1')]

如果你不介意字符串......

或者只是转换,如果你想要整理:

>>> map(tuple, (map(int, format(x,'04b')) for x in range(16)))
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 0, 1), (0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 0, 1), (1, 0, 1, 0), (1, 0, 1, 1), (1, 1, 0, 0), (1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]