使用itertools生成2个1和3个零的所有排列

时间:2012-02-17 10:47:34

标签: python combinatorics itertools

可能是基本的,但在任何其他问题中找不到它。 我试过了:

print ["".join(seq) for seq in itertools.permutations("00011")]

但是有很多重复,看起来像itertools不理解所有的零,所有的都是相同的......

我错过了什么?

编辑:

糟糕。感谢Gareth,我发现这个问题是重复的:permutations with unique values。 没关闭它,因为我认为我的问题的措辞更清楚。

2 个答案:

答案 0 :(得分:2)

set("".join(seq) for seq in itertools.permutations("00011"))

答案 1 :(得分:2)

list(itertools.combinations(range(5), 2))

返回10个位置的列表,其中两个位置可以在五位数内(其他为零):

[(0, 1),
 (0, 2),
 (0, 3),
 (0, 4),
 (1, 2),
 (1, 3),
 (1, 4),
 (2, 3),
 (2, 4),
 (3, 4)]

对于2个1和13个零的情况,请使用:

list(itertools.combinations(range(5), 2))

返回105个职位的列表。它比原始解决方案快得多。

现在功能:

def combiner(zeros=3, ones=2):
    for indices in itertools.combinations(range(zeros+ones), ones):
        item = ['0'] * (zeros+ones)
        for index in indices:
            item[index] = '1'
        yield ''.join(item)

print list(combiner(3, 2))

['11000',
 '01100',
 '01010',
 '01001',
 '00101',
 '00110',
 '10001',
 '10010',
 '00011',
 '10100']

这需要14.4μs。

list(combiner(13, 2))

返回105个元素需要134μs。