从列表中递归创建元组

时间:2011-12-28 17:10:09

标签: 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中的列表理解如何工作。有什么想法吗?

感谢。

4 个答案:

答案 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