我正在尝试编写一个执行此操作的函数:返回所有具有N位数的二进制数,并按排序顺序。每个二进制数表示为元组。调用AllBinary(N)的结果是一个包含2 ^ N个二进制数的元组。示例:
AllBinary(2)
[(0, 0), (0, 1), (1, 0), (1, 1)]
我正在尝试使用for或while循环编写函数。这是我的代码:
def AllBinary(N):
c =[]
for i in range(2**N):
我想我可以通过循环创建二进制元组然后将它们添加到空列表c来使用累积for循环来解决它。但我不知道我将如何编写循环来获取这些二进制元组。
答案 0 :(得分:3)
def AllBinary(N):
import itertools
return itertools.product((0, 1), repeat=N)
示例:
>>> for t in AllBinary(3):
... print t
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
答案 1 :(得分:1)
您只需要再添加2行
>>> def AllBinary(N):
... c =[]
... for i in range(2**N):
... c.append(tuple((i>>j)&1 for j in reversed(range(N))))
... return c
...
>>> AllBinary(3)
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
如果您不乐意使用按位运算符(尽管效率较低)
>>> def AllBinary(N):
... c =[]
... for i in range(2**N):
... c.append(tuple((i//2**j)%2 for j in reversed(range(N))))
... return c
...
>>> AllBinary(3)
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
答案 2 :(得分:0)
这称为电源组。
这些算法有很多复制和粘贴算法。
但是,2 ^ n是很多+ Python的开销(如果我没记错的话,每个int为12个字节),32位数字将为每个字节提供4gb,因此4 * 12 = 48gb的存储空间。
查看一个数字是否在此幂集中是微不足道的。
这也是了解发电机和屈服的一个很好的借口,因为有限的功率集是可数的。
答案 3 :(得分:0)
def AllBinary(N):
c =[]
for i in xrange(2**N):
c.append(tuple(bin(i)[2:].zfill(N)))
return c
说明:
for i in xrange(2**N):
- 注意:在此处使用xrange
代替range
可以提高效率。希望你已经理解为什么我们在0到2 ^ N之间迭代的数学。bin(i)
- 将i
转换为二进制表示形式。例如5
将为0b101
bin(i)[2:]
- 丢弃表示二进制表示的前两个字符,在本例中为0b
bin(i)[2:].zfill(N)
- 现在将最左边的零填零,因为我们需要N位tuple(...)
- 将此转换为元组c.append(...)
- 将每个此类元组添加到c
列表return c
- 退回或打印,或执行作业所需的内容。答案 4 :(得分:0)
不使用其他函数的递归实现:
def all_bin(n):
if n == 1:
return [(0,), (1,)]
return [(i, ) + b for i in (0, 1) for b in all_bin(n - 1)]
答案 5 :(得分:0)
您可以使用嵌套for循环来解决此问题
def AllBinary(num):
result, binary = [[]], (0, 1)
for total in xrange(num):
result = [i + [j] for i in result for j in binary]
return result
print AllBinary(2)
print AllBinary(3)
<强>输出强>
[[0, 0], [0, 1], [1, 0], [1, 1]]
[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
注意:与使用itertools.product相同,但我们不需要import
任何内容。