查找列表中元素的所有可能布置,并保留元素和列表长度

时间:2018-12-15 15:41:31

标签: python list combinations

我想通过切换元素的顺序来找到列表中元素的每种组合,同时保持它们的数量和列表的长度。

例如,对于列表:

[1,2,1,3]

我想获得以下信息:

[1,1,2,3]    
[1,1,3,2]
[1,2,1,3]
[1,2,3,1]
[1,3,1,2]
[1,3,2,1]
[2,1,1,3]
[2,1,3,1]
[2,3,1,1]
[3,1,1,2]
[3,1,2,1]
[3,2,1,1]

请注意,相同的元素(例如原始列表中的两个1)不会被视为单独的元素,因此必须将两个可能性[1a,1b,2,3][1b,1a,2,3]视为一个

1 个答案:

答案 0 :(得分:3)

您想要删除重复项的置换(因为有2个相同的元素),请使用set并将每个元素转换为list(或保留为元组)

import itertools

s = [1,2,1,3]
for x in set(itertools.permutations(s)):
    print(list(x))

结果:

[1, 2, 3, 1]
[1, 3, 2, 1]
[3, 1, 1, 2]
[2, 1, 3, 1]
[2, 3, 1, 1]
[1, 2, 1, 3]
[1, 1, 2, 3]
[3, 1, 2, 1]
[3, 2, 1, 1]
[1, 1, 3, 2]
[1, 3, 1, 2]
[2, 1, 1, 3]

这会产生12个元素,而使用permutations时会产生24个元素,但是由于有2个相同的元素,因此数字除以2。

理解力:

result = [list(x) in set(itertools.permutations(s))]

请注意,通常,使用setcombinationspermutations删除重复项并不是最有效的解决方案。这里的结果很容易,而且没有那么大的损失,因为结果/计算比率不是指数级的(我在这里尝试过这种技术,那太浪费了:List all combinations of combinations,计算720个排列以获得15个组的列表)。