我有一份清单,例如:
[[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中的列表理解如何工作。有什么想法吗?
感谢。
答案 0 :(得分:4)
你有一个列表列表(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,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)]
答案 1 :(得分: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)]
答案 2 :(得分: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))))
答案 3 :(得分:0)
您需要的基本机制在函数式编程中称为zip
。来自Haskell Prelude:
zip
获取两个列表并返回相应对的列表。如果一个输入列表很短,则会丢弃较长列表中的多余元素。
有built-in zip() function in Python that does essentially the same thing。