如何生成列表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))
答案 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