python - 在保持元素和列表长度的列表中查找每个可能的元素配置
问题描述
我想通过切换元素的顺序来找到列表中元素的每个组合,同时保持它们的计数和列表的长度。
例如,对于列表:
[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]
必须算作一个
解决方案
您希望删除重复的排列(因为有 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
用于删除重复项combinations
或permutations
不是最高效的解决方案。在这里它很容易而且没有那么有损,因为结果/计算比不是指数的(我在这里尝试过这种技术,这太浪费了:列出所有组合的组合,计算 720 个排列以获得 15 个组的列表)。
推荐阅读
- javascript - 如何在 javaScript 中对 .svg 文件进行采样?
- netlogo - 如何让每只乌龟对一个变量取不同的随机值?
- sql-server - 在 sql server 中安排活动
- ios - 尝试将子 ViewController 的视图添加到视图容器时,它的视图为零
- git - Git 差异状态标志
- css - 悬停具有 rgba 不透明度的表格行不起作用
- c++ - 无效写入 valgrind 导致分段错误
- git - 如何在保留提交日志的同时跨多个提交修改同一文件中的相同值?
- python - 如何在不拟合的情况下实例化具有已知系数的 Scikit-Learn 线性模型
- c# - 何时使用 SelectMany 与 SelectManyAwait