可能的二进制数函数Python

时间:2013-10-30 00:45:25

标签: python python-3.x

我正在尝试编写一个执行此操作的函数:返回所有具有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循环来解决它。但我不知道我将如何编写循环来获取这些二进制元组。

6 个答案:

答案 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任何内容。