Python 从列表递归创建元组

Python 从列表递归创建元组,python,tuples,Python,Tuples,我有一个列表,例如: [[1,2,3],[4,5,6],[7,8,9]] 我试图创建(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,4),(2,5),(4,7),(4,8),… 换句话说,第一个列表中的项应该是包含后续列表中的项的元组、第二个列表中的项、包含后续列表中的项的元组等等,直到我们到达最后一个列表 我有点不确定python中的列表理解是如何工作的。有什么想法吗 谢谢。在函数式编程中,您需要的基本机制称为zip。从: zip获取两个列表并返回对应对的列表。如

我有一个列表,例如:
[[1,2,3],[4,5,6],[7,8,9]]
我试图创建
(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,4),(2,5),(4,7),(4,8),…

换句话说,第一个列表中的项应该是包含后续列表中的项的元组、第二个列表中的项、包含后续列表中的项的元组等等,直到我们到达最后一个列表

我有点不确定python中的列表理解是如何工作的。有什么想法吗


谢谢。

在函数式编程中,您需要的基本机制称为
zip
。从:

zip
获取两个列表并返回对应对的列表。如果一个输入列表较短,则丢弃较长列表中多余的元素

有一个。

您有一个列表(lol),然后,从列表中弹出第一个项目,并使用连接其余列表的笛卡尔乘积:

import itertools
lol = [[1,2,3],[4,5,6],[7,8,9]]
result = list()
while lol:
    l=lol.pop(0)
    o=itertools.chain(*lol)
    result += itertools.product( l,o )
结果
[(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,4),(2,5),(2,7),(2,8),(2,9),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,7),(4,8),(5,9),(6,7),(6,8),(6,9)]

仅使用大列表理解的解决方案是:

警告:仅适用于列表

结果:

[(1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 7), (4, 8), (4, 9), (5, 7), (5, 8), (5, 9), (6, 7), (6, 8), (6, 9)]

在不破坏原始列表的情况下:

from itertools import chain, product
lol = [[1,2,3],[4,5,6],[7,8,9]]
list(chain(*(product(item, chain(*lol[index+1:])) for index, item in enumerate(lol))))

这是家庭作业吗?到目前为止你试过什么?元组顺序对这个案子不重要?i、 例如,生成(4,7)就足够了,您也不必生成(7,4)?元组顺序很重要。现在,我正在处理
print[(y,z)for z in list for y in z for x in y]
但是在上面的例子中,我们只需要(4,7)而不是(7,4)更正式地说,是不是“对于由[a_1,a_2,…,a_n]定义的列表,对于a_k的每个元素a_j,生成一个元组(a_k j,a_i_h)对于每个列表a_i中的所有h,其中i>k和i ok,我将看看是否可以使其适用于两个以上的列表。它已经可以了。需要多少个iterables,从左到右进行评估。-1这并不是OP想要的。OP希望第一个子列表的每个元素都与剩余子列表的每个元素配对,以供检查ple.neat.我之前必须做一个deepcopy:-)你能解释一下上面的sum([],[])是如何工作的吗?找不到任何相关文档。感谢
sum
中的第二个参数就像一个初始值。然后,它开始使用
+=
添加(到初始值)第一个参数中的所有元素。这就是
sum([[1,2],[3],[6])的原因
返回
[6,1,2,3]
[6]+[1,2]+[3]
from itertools import chain, product
lol = [[1,2,3],[4,5,6],[7,8,9]]
list(chain(*(product(item, chain(*lol[index+1:])) for index, item in enumerate(lol))))