Python-使用itertools生成二进制列表
我想生成以下输出: [11000]所有与这些数字的组合,但没有双精度Python-使用itertools生成二进制列表,python,list,binary,itertools,Python,List,Binary,Itertools,我想生成以下输出: [11000]所有与这些数字的组合,但没有双精度 [11000] [01100] [00110] [00011] [10100] . . . 但我不知道该怎么做。在我的问题中,列表中有365个值,大约有20个值。您可以使用: 您可以检查是否只获得唯一字符串: from itertools import filterfalse, permutations # ifilterfalse in 2.x def unique_p
[11000]
[01100]
[00110]
[00011]
[10100]
.
.
.
但我不知道该怎么做。在我的问题中,列表中有365个值,大约有20个值。您可以使用:
您可以检查是否只获得唯一字符串:
from itertools import filterfalse, permutations # ifilterfalse in 2.x
def unique_permutations(s):
seen = set()
for p in filterfalse(seen.__contains__, permutations(s)):
seen.add(p)
yield "".join(p)
对于len=5,我得到10个输出值:
['11000', '10100', '10010', '10001', '01100',
'01010', '01001', '00110', '00101', '00011']
生成器使其比预先构建列表更高效,并且它只加入所需的内容,但您仍将丢弃许多排列。您有365个可能的位置来放置20个位置。所以一种方法是把所有的20个长度组合在365个位置上
这在代码中是什么样子的示例:
from itertools import combinations
n = 365
r = 20
for indexes in combinations(range(n), r):
base = [0]*n
for i in indexes:
base[i] = 1
print(base)
由于这是一个“n选择r”问题,您将有许多可能的组合!要计算数量,请使用:n!/(r!(n-r)!=365!/(20!(365-20)!=4261128273338828179808453831565930。请发布您的现有代码并描述具体问题。这个问题归结为“n选择r”,在您的案例中是“365选择20”。这意味着有4.3E32可能的组合。这不行,它将打印OP(似乎)不想要的双倍。为了便于修复,您可以将排列放入一个集合中,但问题是itertools。排列将生成365!=2.5E778项…确切地说,这就是我遇到的问题。您的代码会生成双倍。由于性能原因,将它们过滤掉也不是很好。
from itertools import combinations
n = 365
r = 20
for indexes in combinations(range(n), r):
base = [0]*n
for i in indexes:
base[i] = 1
print(base)