列表列表的子列表的循环/递归排列

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.productitertools.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 签名或容器中的迭代器。

以上是关于列表列表的子列表的循环/递归排列的主要内容,如果未能解决你的问题,请参考以下文章

递归循环遍历对象以构建属性列表

使用 Ruby/Erlang 迭代生成排列,无需递归或堆栈

如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]

Java递归回溯问题

递归地将日期列表分组

使用 for 循环比较来自两个列表/元组的元素(在递归中)