首页 > 解决方案 > 在保持元素和列表长度的列表中查找每个可能的元素配置

问题描述

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

例如,对于列表:

[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]必须算作一个

标签: pythonlistcombinations

解决方案


您希望删除重复的排列(因为有 2 个相同的元素),使用 aset并转换为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 个元素,而使用时为 24 个,permutations但由于有 2 个相同的元素,因此该数字除以 2。

作为理解:

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

请注意,一般来说,set用于删除重复项combinationspermutations不是最高效的解决方案。在这里它很容易而且没有那么有损,因为结果/计算比不是指数的(我在这里尝试过这种技术,这太浪费了:列出所有组合的组合,计算 720 个排列以获得 15 个组的列表)。


推荐阅读