我想通过切换元素的顺序来找到列表中元素的每种组合,同时保持它们的数量和列表的长度。
例如,对于列表:
[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]
视为一个
答案 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))]
请注意,通常,使用set
从combinations
或permutations
删除重复项并不是最有效的解决方案。这里的结果很容易,而且没有那么大的损失,因为结果/计算比率不是指数级的(我在这里尝试过这种技术,那太浪费了:List all combinations of combinations,计算720个排列以获得15个组的列表)。>