如何在没有重复的情况下在Python中获得排列

时间:2016-01-14 03:18:24

标签: python python-2.7 permutation

我正在使用Ising model做一些工作。我编写了一个代码来帮助我计算一个格子的多重性,但是如果没有得到MemoryError,我就无法达到任何大数。

基本的想法是,你有一个零和一个列表,比如说[0,0,1,1]。我想生成一组所有可能的1和0的排序。所以在这个例子中我想要一个这样的集合:

[(1,1,0,0),(1,0,1,0),(1,0,0,1),(0,1,1,0),(0,1,0,1),(0,0,1,1)]

目前我这样做了:

set_initial=[0,0,1,1]
set_intermediate=[]
for subset in itertools.permutations(set_initial,4):
    set_intermediate.append(subset)
set_final=list(set(set_intermediate))

问题在于,在set_intermediate中,对于此示例,有2^4个元素,其中只有six个唯一的元素。另外举例如[0,0,0,0,0,0,0,0,1],有2^9个元素,只有9个唯一。

是否有另一种方法可以使set_intermediate成为瓶颈?

2 个答案:

答案 0 :(得分:2)

您可以考虑选择1的位置作为组合,而不是排列。 (我知道我做过类似的事情before ..)

>>> list(binary_perm([0,0,1,1]))
[[1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1], [0, 1, 1, 0], [0, 1, 0, 1], [0, 0, 1, 1]]
>>> %timeit sum(1 for x in binary_perm([1]+[0]*10**4))
1 loops, best of 3: 409 ms per loop

不是超级快,但产生的输出数量恰到好处,因此可以处理更长的序列:

switchToLatest

当然,通常你首先要避免循环使用这些,但是根据你对permeations的处理方式,你可能无法直接计算出独特排列的数量。

答案 1 :(得分:1)

尝试使用内置方法 itertools.permutation(iterable,r)