列表列表的子列表的循环/递归排列
Posted
技术标签:
【中文标题】列表列表的子列表的循环/递归排列【英文标题】:Loop/recursion permutations of sublists of list of lists 【发布时间】:2021-09-15 15:22:19 【问题描述】:我有一个列表列表,例如 [[0,1,2,3],[0,1,2,3], ..., [0,1,2,3]]
,其长度是先验未知的。
我的目标是遍历[0,1,2,3]
子列表的所有排列组合,每个组合都是一个列表列表,就像原始列表一样,但其中一些子列表的顺序发生了变化,例如。第二个组合可以是[[0,1,3,2],[0,1,2,3], ..., [0,1,2,3]]
和第三个[[0,3,1,2],[0,1,2,3], ..., [0,1,2,3]]
。我会将它们中的每一个用于其他用途。
我想它就像一个构建二进制表一样,第一个将遍历第一个子列表的排列,保持其余子列表不变;完成后,他们在第二个子列表中推进一个排列,然后返回第一个并再次循环,依此类推。一个更简单的例子:
| [0,1] | [0,1] | [0,1] |
| [0,1] | [0,1] | [1,0] |
| [0,1] | [1,0] | [0,1] |
| [0,1] | [1,0] | [1,0] |
| [1,0] | [0,1] | [0,1] |
| [1,0] | [0,1] | [1,0] |
| [1,0] | [1,0] | [0,1] |
| [1,0] | [1,0] | [1,0] |
我遇到了这个问题,因为我考虑它的方式看起来我需要有可变数量的嵌套循环。我不知道如何从递归的角度来考虑它,因为一旦递归,我也需要循环,而一旦我return
,循环就会丢失。
任何帮助表示赞赏。
【问题讨论】:
最好用更小的数据来展示例子,比如[[1,2],[3,4], [5,6]]
【参考方案1】:
您可以将itertools.product
与itertools.permutations
一起使用:
import itertools as it
d = [[0,1,2,3], [0,1,2,3], [0,1,2,3]]
r = list(it.product(*[it.permutations(i, len(i)) for i in d]))
输出:
[((0, 1, 2, 3), (0, 1, 2, 3), (0, 1, 2, 3)),
((0, 1, 2, 3), (0, 1, 2, 3), (0, 1, 3, 2)),
((0, 1, 2, 3), (0, 1, 2, 3), (0, 2, 1, 3)),
((0, 1, 2, 3), (0, 1, 2, 3), (0, 2, 3, 1)),
((0, 1, 2, 3), (0, 1, 2, 3), (0, 3, 1, 2)),
((0, 1, 2, 3), (0, 1, 2, 3), (0, 3, 2, 1)),
((0, 1, 2, 3), (0, 1, 2, 3), (1, 0, 2, 3)),
((0, 1, 2, 3), (0, 1, 2, 3), (1, 0, 3, 2)),
((0, 1, 2, 3), (0, 1, 2, 3), (1, 2, 0, 3)),
((0, 1, 2, 3), (0, 1, 2, 3), (1, 2, 3, 0)),
...
]
【讨论】:
谢谢,正是我想要的。我从来没有见过这样使用星号,你能告诉我它是做什么的吗? @miguesxvi*
unpacks 签名或容器中的迭代器。以上是关于列表列表的子列表的循环/递归排列的主要内容,如果未能解决你的问题,请参考以下文章