我有列表,如清单:
[[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,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中的列表理解如何工作。有任何想法吗?
谢谢。
你的目录列表(笑),然后从列表列表弹出第一个项目,使笛卡尔乘积与连击剩下的列表:
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)]
函数式编程中所需的基本机制叫zip
。从Haskell Prelude:
zip
取两个列表并返回相应对的列表。如果一个输入列表很短,则放弃较长列表中的多余元素。
还有一个built-in zip() function in Python that does essentially the same thing。
仅使用大列表理解的解决方案是:
警告:仅供列表理解爱好者
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)]
很整洁! + 1 – Duke 2011-12-28 19:01:48
你能解释一下上面的sum([],[])是如何工作的吗?找不到任何文档。谢谢 – Duke 2012-04-16 05:29:54
'sum'中的第二个参数就像初始值。然后,它开始使用'+ ='将第一个参数中的所有元素添加到(初始值)。这就是为什么'sum([[1,2],[3]],[6])返回'[6,1,2,3]'('[6] + [1,2] + [3]' ) – juliomalegria 2012-04-25 20:15:37
不破坏原有名单:
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))))
整齐。我不得不在以前做一个deepcopy :-) – Duke 2011-12-29 21:14:32
哪种语言,Python的? – 2011-12-28 17:11:20
这是功课吗?你试过什么了? – 2011-12-28 17:13:08
是的我正在使用python – Duke 2011-12-28 17:13:14