在python中生成列表的所有组合

时间:2013-07-02 19:22:10

标签: python list combinations

以下是问题:

鉴于Python中的项目列表,我将如何获得项目的所有可能组合?

这个网站上有几个类似的问题,建议使用itertools.combine,但这只会返回我需要的一部分:

stuff = [1, 2, 3]
for L in range(0, len(stuff)+1):
    for subset in itertools.combinations(stuff, L):
        print(subset)

()
(1,)
(2,)
(3,)
(1, 2)
(1, 3)
(2, 3)
(1, 2, 3)

如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2,1,3),(3,1,2) ),(2,3,1)和(3,2,1)。有一些解决方法吗?我似乎无法想出任何东西。

7 个答案:

答案 0 :(得分:33)

使用itertools.permutations:

>>> import itertools
>>> stuff = [1, 2, 3]
>>> for L in range(0, len(stuff)+1):
        for subset in itertools.permutations(stuff, L):
                print(subset)
...         
()
(1,)
(2,)
(3,)
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
....

itertools.permutations上的帮助:

permutations(iterable[, r]) --> permutations object

Return successive r-length permutations of elements in the iterable.

permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)
>>> 

答案 1 :(得分:9)

您可以使用这个简单的代码在python中生成列表的所有组合

import itertools

a = [1,2,3,4]
for i in xrange(1,len(a)+1):
   print list(itertools.combinations(a,i))

<强>结果:

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

答案 2 :(得分:6)

您是否正在寻找itertools.permutations

来自help(itertools.permutations)

Help on class permutations in module itertools:

class permutations(__builtin__.object)
 |  permutations(iterable[, r]) --> permutations object
 |  
 |  Return successive r-length permutations of elements in the iterable.
 |  
 |  permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)

示例代码:

>>> from itertools import permutations
>>> stuff = [1, 2, 3]
>>> for i in range(0, len(stuff)+1):
        for subset in permutations(stuff, i):
               print(subset)


()
(1,)
(2,)
(3,)
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)

来自维基百科,排列和组合之间的区别:

排列:

  

非正式地,一组对象的排列是将这些对象排列成特定顺序。例如,集合{1,2,3}有六个排列,即(1,2,3),(1,3,2),(2,1,3),(2,3,1) ,(3,1,2)和(3,2,1)。

组合:

  

在数学中,组合是一种从较大的群体中选择几种东西的方式,其中(与排列不同)顺序无关紧要。

答案 3 :(得分:2)

itertools.permutations将成为你想要的。通过数学定义,顺序与combinations无关,意味着(1,2)被认为与(2,1)相同。鉴于permutations,每个不同的排序都会计为唯一排列,因此(1,2)(2,1)完全不同。

答案 4 :(得分:2)

这是一个没有itertools的解决方案

首先,让我们定义01的指标向量与子列表(1之间的转换,如果该项位于子列表中)

def indicators2sublist(indicators,arr):
   return [item for item,indicator in zip(arr,indicators) if int(indicator)==1]

接下来,好好定义从02^n-1之间的数字到其二进制向量表示的映射(使用字符串的format函数):

def bin(n,sz):
   return ('{d:0'+str(sz)+'b}').format(d=n)

我们要做的就是迭代所有可能的数字,然后拨打indicators2sublist

def all_sublists(arr):
  sz=len(arr)
  for n in xrange(0,2**sz):
     b=bin(n,sz)
     yield indicators2sublist(b,arr)

答案 5 :(得分:0)

我假设你想要所有可能的组合作为'集'值。这是我写的一段代码,可能会帮助你一个想法:

def getAllCombinations(object_list):
    uniq_objs = set(object_list)
    combinations = []
    for obj in uniq_objs:
        for i in range(0,len(combinations)):
            combinations.append(combinations[i].union([obj]))
        combinations.append(set([obj]))
return combinations

以下是一个示例:

combinations = getAllCombinations([20,10,30])
combinations.sort(key = lambda s: len(s))
print combinations
... [set([10]), set([20]), set([30]), set([10, 20]), set([10, 30]), set([20, 30]), set([10, 20, 30])]

我认为这有n!时间复杂,所以要小心。这可行,但效率可能不高

答案 6 :(得分:-1)

我只是觉得我把它放在那里因为我无法完成每一个可能的结果并且记住我在python方面只有最基本的知识,而且很可能一个更优雅的解决方案...(也可以原谅可怜的变量名称

测试= [1,2,3]

testing2 = [0]

n = -1

def testingSomethingElse(number):

try:

    testing2[0:len(testing2)] == testing[0]

    n = -1

    testing2[number] += 1

except IndexError:

    testing2.append(testing[0])

而True:

n += 1

testing2[0] = testing[n]

print(testing2)

if testing2[0] == testing[-1]:

    try:

        n = -1

        testing2[1] += 1

    except IndexError:

        testing2.append(testing[0])

    for i in range(len(testing2)):

        if testing2[i] == 4:

            testingSomethingElse(i+1)

            testing2[i] = testing[0]

我离开了== 4因为我正在使用整数,但你可能不得不相应地修改它......