lem*_*ree 2 python cartesian-product
如何在Python中以优雅(简洁)的方式计算列表上的n次笛卡尔积,即A \xc3\x97 ... \xc3\x97 A(n次)?
\n例子:
\n>>> l = ["a", "b", "c"]\n>>> cart_prod(l, 0)\n[]\n>>> cart_prod(l, 1)\n[(\'a\',), (\'b\',), (\'c\',)]\n>>> cart_prod(l, 2)\n[(\'a\', \'a\'), (\'a\', \'b\'), (\'a\', \'c\'), (\'b\', \'a\'), (\'b\', \'b\'), (\'b\', \'c\'), (\'c\', \'a\'), (\'c\', \'b\'), (\'c\', \'c\')]\n>>> cart_prod(l, 3)\n[(\'a\', \'a\', \'a\'), (\'a\', \'a\', \'b\'), (\'a\', \'a\', \'c\'), (\'a\', \'b\', \'a\'), (\'a\', \'b\', \'b\'), (\'a\', \'b\', \'c\'), (\'a\', \'c\', \'a\'), (\'a\', \'c\', \'b\'), (\'a\', \'c\', \'c\'),\n (\'b\', \'a\', \'a\'), (\'b\', \'a\', \'b\'), (\'b\', \'a\', \'c\'), (\'b\', \'b\', \'a\'), (\'b\', \'b\', \'b\'), (\'b\', \'b\', \'c\'), (\'b\', \'c\', \'a\'), (\'b\', \'c\', \'b\'), (\'b\', \'c\', \'c\'),\n (\'c\', \'a\', \'a\'), (\'c\', \'a\', \'b\'), (\'c\', \'a\', \'c\'), (\'c\', \'b\', \'a\'), (\'c\', \'b\', \'b\'), (\'c\', \'b\', \'c\'), (\'c\', \'c\', \'a\'), (\'c\', \'c\', \'b\'), (\'c\', \'c\', \'c\')]\nRun Code Online (Sandbox Code Playgroud)\n我想出了以下迭代解决方案:
\n>>> l = ["a", "b", "c"]\n>>> cart_prod(l, 0)\n[]\n>>> cart_prod(l, 1)\n[(\'a\',), (\'b\',), (\'c\',)]\n>>> cart_prod(l, 2)\n[(\'a\', \'a\'), (\'a\', \'b\'), (\'a\', \'c\'), (\'b\', \'a\'), (\'b\', \'b\'), (\'b\', \'c\'), (\'c\', \'a\'), (\'c\', \'b\'), (\'c\', \'c\')]\n>>> cart_prod(l, 3)\n[(\'a\', \'a\', \'a\'), (\'a\', \'a\', \'b\'), (\'a\', \'a\', \'c\'), (\'a\', \'b\', \'a\'), (\'a\', \'b\', \'b\'), (\'a\', \'b\', \'c\'), (\'a\', \'c\', \'a\'), (\'a\', \'c\', \'b\'), (\'a\', \'c\', \'c\'),\n (\'b\', \'a\', \'a\'), (\'b\', \'a\', \'b\'), (\'b\', \'a\', \'c\'), (\'b\', \'b\', \'a\'), (\'b\', \'b\', \'b\'), (\'b\', \'b\', \'c\'), (\'b\', \'c\', \'a\'), (\'b\', \'c\', \'b\'), (\'b\', \'c\', \'c\'),\n (\'c\', \'a\', \'a\'), (\'c\', \'a\', \'b\'), (\'c\', \'a\', \'c\'), (\'c\', \'b\', \'a\'), (\'c\', \'b\', \'b\'), (\'c\', \'b\', \'c\'), (\'c\', \'c\', \'a\'), (\'c\', \'c\', \'b\'), (\'c\', \'c\', \'c\')]\nRun Code Online (Sandbox Code Playgroud)\n这段代码完成了这项工作,但是是否有更短的、可能是单行的定义,可能是嵌套列表理解或 lambda 表达式?我对更紧凑的解决方案感兴趣,不一定是更具可读性的解决方案。
\n这个问题不是获取一系列列表的笛卡尔积吗?。我不希望一系列列表的笛卡尔积相互交叉。我想要一个列表与自身交叉 n 次的笛卡尔积,其中 n 是赋予函数的参数。
\nitertools.product采用关键字参数来指示应该重复给定的参数。
>>> from itertools import product
>>> list(product([1,2], repeat=0))
[()]
>>> list(product([1,2], repeat=1))
[(1,), (2,)]
>>> list(product([1,2], repeat=2))
[(1, 1), (1, 2), (2, 1), (2, 2)]
Run Code Online (Sandbox Code Playgroud)
这也适用于多个可迭代对象。
# Equivalent to list(product([1,2], ['a', 'b'], [1,2], ['a', 'b']))
>>> list(product([1,2], ['a', 'b'], repeat=2))
[(1, 'a', 1, 'a'), (1, 'a', 1, 'b'), (1, 'a', 2, 'a'), (1, 'a', 2, 'b'), (1, 'b', 1, 'a'), (1, 'b', 1, 'b'), (1, 'b', 2, 'a'), (1, 'b', 2, 'b'), (2, 'a', 1, 'a'), (2, 'a', 1, 'b'), (2, 'a', 2, 'a'), (2, 'a', 2, 'b'), (2, 'b', 1, 'a'), (2, 'b', 1, 'b'), (2, 'b', 2, 'a'), (2, 'b', 2, 'b')]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |