从列表递归创建元组

2 投票
4 回答
1717 浏览
提问于 2025-04-17 09:09

我有一个列表,里面又包含了几个列表,比如说:
[[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中如何使用列表推导式来实现这个有点不太确定。有没有什么想法呢?

谢谢。

4 个回答

1

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

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))))
2

这里有一个只用大列表推导式的解决方案:

警告:这个方法只适合喜欢列表推导式的人

sum([[(elem,e) for e in sum(my_lists[i+1:], [])] for i,my_list in enumerate(my_lists[:-1]) for j,elem in enumerate(my_list)], [])

结果:

[(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)]
4

你有一个列表的列表(可以理解为一个大列表里面装着多个小列表),然后你需要从这个大列表中取出第一个小列表的内容,接着把剩下的小列表合并在一起,最后计算出所有可能的组合,叫做笛卡尔积。

结果会是这样的:

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, 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)]

撰写回答