2011-12-28 72 views
1

我有列表,如清单:
[[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中的列表理解如何工作。有任何想法吗?

谢谢。

+1

哪种语言,Python的? – 2011-12-28 17:11:20

+0

这是功课吗?你试过什么了? – 2011-12-28 17:13:08

+0

是的我正在使用python – Duke 2011-12-28 17:13:14

回答

3

你的目录列表(笑),然后从列表列表弹出第一个项目,使笛卡尔乘积与连击剩下的列表:

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

+0

哈哈,谢谢。 +1为简明 – Duke 2011-12-28 17:27:51

+0

欢迎您,哈哈。 – danihp 2012-01-04 22:05:03

0

函数式编程中所需的基本机制叫zip。从Haskell Prelude

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

还有一个built-in zip() function in Python that does essentially the same thing

+0

我将如何实现? – Duke 2011-12-28 17:12:55

+0

嵌入到Python:http://docs.python.org/library/functions.html#zip – sczizzo 2011-12-28 17:14:15

+0

好吧,我会看看如果我可以得到这个工作超过两个列表。 – Duke 2011-12-28 17:18:07

1

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

警告:仅供列表理解爱好者

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)] 
+0

很整洁! + 1 – Duke 2011-12-28 19:01:48

+0

你能解释一下上面的sum([],[])是如何工作的吗?找不到任何文档。谢谢 – Duke 2012-04-16 05:29:54

+0

'sum'中的第二个参数就像初始值。然后,它开始使用'+ ='将第一个参数中的所有元素添加到(初始值)。这就是为什么'sum([[1,2],[3]],[6])返回'[6,1,2,3]'('[6] + [1,2] + [3]' ) – juliomalegria 2012-04-25 20:15:37

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)))) 
+0

整齐。我不得不在以前做一个deepcopy :-) – Duke 2011-12-29 21:14:32