生成所有长度的所有排列

时间:2010-11-02 04:51:04

标签: permutation

如何生成列表b(1,6,8,3,9,5)的所有可能排列,包括不同长度的排列?例如:

List a = [1,2,3]
generateperms(a)
1,2,3
3,1,2
3,2,1
1,3,2
2,1,3
2,3,1
2,3
1,2
1,3
2,1
3,2
3,1

等等,并得到每个长度的所有permutarions?

编辑: 我只是要使用它,用python编写,效果很好:

import itertools  
a = ['a','b','c']  
for i in range(len(a)):  
    print list(itertools.permutations(a,i+1))  

6 个答案:

答案 0 :(得分:5)

我认为这将是每个子集的所有排列。

返回子集的最简单方法是考虑从0(空集)到输入列表长度(完整集)的所有二进制整数。因此,您从0开始计算并包括2**(length(input)),并使用结果来屏蔽要从该特定子集中排除的所有元素。

从那里你应该能够在'网上使用许多代码中的任何一个用于返回排列。

答案 1 :(得分:2)

我建议从更简单的东西开始。假设l是包含n元素的列表。首先,您是否可以编写一个函数来生成l的所有具有固定长度k的排列?然后,你能找到一种方法,用不同的k值重复调用该函数,以生成长度为0的排列,长度为1的所有排列,长度为2的所有排列,依此类推,直到达到{{1 }}?

答案 2 :(得分:1)

考虑生成字符串的所有排列的递归实现。如果您在构建子存储时存储子排列,那么您将拥有所需的所有子排列。

在erlang中,作为起点(3.3 Permutations的修改版本)

perms([]) -> [[]];
perms(L) ->
  [ [H|T] || H <- L, T <- perms(L -- [H])]
  ++ [ [T] || H <- L, T <- perms(L -- [H]) ].

但请注意,这会留下重复数据和大量空数组,您必须将其删除才能使输出更漂亮。

答案 3 :(得分:1)

之前我曾提到过,我在Python中编造了一个可怕的lambda表达式,使用他们在2.6中添加的bin()整数到二进制字符串内置函数来生成序列的所有子集。

这是它的丑陋版本:

subsets = lambda s: (
    (s[x] for x,c in 
       enumerate("0" * (len(s)-len(bin(i)[2:])) + bin(i)[2:])
       if int(c)) 
     for i in range(0,2**len(s)
     )
)

但我注意到我可以通过简单调用字符串的"0" * ... +"方法替换该表达式的zfill()部分(感谢SO User: gimel)。所以这变得有点不那么可憎了:

subsets = lambda s: (
        [s[x] for x,c in 
              enumerate(bin(i)[2:].zfill(len(s)))
              if int(c)
              ]
        for i in range(0,2**len(s))
    )

尽管它出现了,但它是我所描述的相对简单的实现:给定二进制字符串表示从零到我们的集合大小的任何整数,屏蔽掉我们的二进制字符串中对应于零的任何元素。这就是内部列表理解。外(生成器)表达式只涵盖必要的范围。

OP使用itertools.permutations()和两个参数的方法更优雅。如果我知道查看该函数的__doc__字符串,我可能会想到它。但是,我确实花了一点时间说服自己两种方法都给出了相同的结果。

答案 4 :(得分:0)

一般来说,长度为n的列表有n!安排或排列。所以有多种长度,我们会有n!(n-k)!其中k为0 < k&lt; Ñ

答案 5 :(得分:0)

对于列 List<Integer> 的列表,我们可以使用这一行:

E

基本上是这样做的:

Integer

例如

feature_cols