【问题标题】:python: create all possible unique lists with 1 or 0 of specific length [duplicate]python:创建具有特定长度的1或0的所有可能的唯一列表[重复]
【发布时间】:2016-04-03 00:43:47
【问题描述】:

我想创建所有可能的二进制向量列表直到指定长度,有没有更好的“pythonic”方法来做到这一点?

1
0
11
10
01
00
111
110
101
100
011
010
001
000
[...]

我使用了递增大小的递归函数:

def createAllBinHelper(length):
    def createAllBin(thelist, length):
        if length == 0:
            allpossibilities.append(thelist)
        else:
            createAllBin(thelist+'1', length-1)
            createAllBin(thelist+'0', length-1)

    allpossibilities = []

    for i in range(1,length):
        createAllBin('', i)

    return allpossibilities

【问题讨论】:

  • @MarkTolonen 我想你的意思是itertools.product
  • 你的意思是用二进制计数? for i in range(n): print(bin(i)[2:])
  • @msw 唯一需要注意的是示例输出的顺序不正确(1、0、3、2、1、0...),这可能无关紧要。

标签: python list combinations permutation


【解决方案1】:

您可以将for 循环与itertools.product 结合使用。

from itertools import product

for i in range(1, 4):
    for p in product('10', repeat=i):
        print(''.join(p))

range 的上限更改为n+1 将允许您设置二进制字符串的最大长度。

这是当前唯一能逐字生成示例输出的答案(仅在顺序重要时才重要)。

【讨论】:

    【解决方案2】:

    也许你会感兴趣这样的事情

    maxLength = 4
    L = ['']
    for n in range(maxLength):
        tmp = []
        for el in L:
            tmp.append(el+'0')
            tmp.append(el+'1')
            tmp.append('')
        L = tmp
    L = sorted(set(L))
    print(L)
    

    输出

    ['', '0', '00', '000', '0000', '0001', '001', '0010', '0011', '01', '010', '0100', '0101', '011', '0110', '0111', '1', '10', '100', '1000', '1001', '101', '1010', '1011', '11', '110', '1100', '1101', '111', '1110', '1111']
    

    【讨论】:

      【解决方案3】:

      如果你觉得有点无聊,这里有别的东西

      maxLength = 4
      tmp = (2**maxLength)-1
      s= ''
      for n in range(1, tmp+1):
          s= ''
          while n>0:
              rem = n % 2
              n = int(n/2)
              s = s + str(rem)
          print(s)
      

      这将为您提供实际的二进制组合(没有全零)。

      哦,是的,然后输出

      1
      01
      11
      001
      101
      011
      111
      0001
      1001
      0101
      1101
      0011
      1011
      0111
      1111
      

      【讨论】:

        猜你喜欢
        • 2015-06-10
        • 1970-01-01
        • 2019-10-28
        • 2023-04-03
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 2022-07-07
        • 2018-08-08
        相关资源
        最近更新 更多