【问题标题】: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]]

标签: python python-3.x loops recursion


【解决方案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 签名或容器中的迭代器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2014-02-04
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多