我想生成以下输出:
[11000]所有这些数字的组合,但没有双打
[11000]
[01100]
[00110]
[00011]
[10100]
.
.
.
但我无法弄清楚如何做到这一点。在我的问题中,列表有365个值,大约有20个。
答案 0 :(得分:1)
您可以使用itertools.permutations()
:
for item in itertools.permutations('11000'):
print ''.join(item)
答案 1 :(得分:0)
您可以检查您是否只获得唯一字符串:
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(s) == 5
的10个输出值:
['11000', '10100', '10010', '10001', '01100',
'01010', '01001', '00110', '00101', '00011']
生成器比预先构建列表更有效率,它只需要join
它所需的内容,但你仍然会放弃很多排列。
答案 2 :(得分:0)
你有365个可能的位置来放置20个。因此,解决这个问题的一种方法是制作365个职位的所有20个长度组合。
代码中的外观示例:
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)!)= 426112827338828179808453831565930。