0

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

4

6 回答 6

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)
于 2013-10-30T00:55:06.750 回答
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)]
于 2013-10-30T01:14:44.410 回答
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任何东西。

于 2013-10-30T01:26:30.217 回答
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)]
于 2013-10-30T00:56:34.410 回答
0

这称为幂集。

有很多用于这些的复制和粘贴算法。

但是,2^n 是很多 + Python 的开销(如果我没记错的话,它是每个 int 12 个字节),32 位数字会给你每个字节 4gb,所以 4*12 = 48gb 的内存要存储。

看看一个数字是否在这个幂集中是微不足道的。

这也是了解生成器和屈服的一个很好的借口,因为有限幂集是可数的。

于 2013-10-30T00:48:58.473 回答
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- 要么退回或打印它,或者按照你的任务要求做。
于 2013-10-30T00:49:04.980 回答