列表列表的所有组合
我基本上正在寻找 List
> 的 python 版本
给定一个列表列表,我需要一个新列表来给出列表之间所有可能的项目组合。
[[1,2,3],[4,5,6],[7,8,9,10]] -> [[1,4,7],[1,4,8],...,[3,6,10]]
列表的数量未知,所以我需要适用于所有情况的东西。 优雅加分!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
您需要
itertools.product
:you need
itertools.product
:只需使用itertools.product:
Simply use
itertools.product
:最优雅的解决方案是在 python 中使用 itertools.product 2.6.
如果您没有使用 Python 2.6,itertools.product 的文档实际上显示了以“手动”方式执行产品的等效函数:
The most elegant solution is to use itertools.product in python 2.6.
If you aren't using Python 2.6, the docs for
itertools.product
actually show an equivalent function to do the product the "manual" way:对于此任务,直接递归没有任何问题,不需要外部依赖项,如果您需要一个使用字符串的版本,这可能适合您的需求:
Nothing wrong with straight up recursion for this task, no need for external dependencies, and if you need a version that works with strings, this might fit your needs:
Numpy 可以做到:
Numpy can do it:
可以使用基础 python 来实现这一点。 该代码需要一个函数来展平列表列表:
然后可以运行:
输出:
One can use base python for this. The code needs a function to flatten lists of lists:
Then one can run:
Output:
这主要模仿 Jarret Hardie 的回答使用 itertools.product,但有以下区别:
itertools.product
,而不是通过变量a
- 因此,*args
语法让您的代码以其他方式“工作” >product 参数(如product(*[[1,2,3],[4,5,6],[7,8,9,10]])
),< code>mypy 可能仍然会失败(类似于error: No overridevariant of "product" matches argument type "List[object]"
)mypy< /code>,就是不使用
*args
语法,如下所示:This mostly mimics solutions like Answer by Jarret Hardie using itertools.product, but has these distinctions:
itertools.product
in-line, instead of via variablea
- so no*args
syntax needed on the inline parameters*args
syntax with inlineproduct
parameters (likeproduct(*[[1,2,3],[4,5,6],[7,8,9,10]])
),mypy
might still fail it (with something likeerror: No overload variant of "product" matches argument type "List[object]"
)mypy
, is to not use*args
syntax, like this:这个答案并不像使用 itertools 那么干净,但这些想法可能有用。
从 zip() 此处 的构造中汲取灵感,我们可以这样做下列。
我们使用
a
作为迭代器,以便连续获取它的下一项,而不需要知道先验有多少。next
命令将输出sentinel
(这是一个专门为了进行比较而创建的对象,请参阅 此处 进行一些解释)当我们用完a
中的列表时,导致if
语句触发所以我们跳出了循环。This answer isn't as clean as using itertools but the ideas could be useful.
Drawing inspiration from the construction of zip() here, we could do the following.
We use
a
as an iterator in order to successively get the next item of it without needing to know how many there are a priori. Thenext
command will outputsentinel
(which is an object created solely to make this comparison, see here for some explanation) when we run out of lists ina
, causing theif
statement to trigger so we break out of the loop.输出:
Output: