我有两个列表,希望将它们合并到一个tuples
列表中。我希望使用list comprehension
执行此操作,我可以使用map
使其正常运行。但很高兴知道这里的列表理解是如何工作的。
代码在这里
>>> lst = [1,2,3,4,5]
>>> lst2 = [6,7,8,9,10]
>>> tup = map(None,lst,lst2) # works fine
>>> tup
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
>>> l3 = [lst, lst2]
>>> l3
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
>>> zip(*l3) # works fine
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
>>> [(i,j) for i in lst and for j in lst2] # does not work
File "<stdin>", line 1
[(i,j) for i in lst and for j in lst2]
^
SyntaxError: invalid syntax
>>>
我写了评论它在哪里工作,哪里没有。如何在for-loop
list comprehension
答案 0 :(得分:13)
将列表推导视为循环。你怎么写2而不是嵌套循环?
你可以用一些奇怪的列表理解来做到这一点:
[(x, lst2[i]) for i, x in enumerate(lst)]
或
[(lst[i], lst2[i]) for i in xrange(len(lst))]
但实际上,最好使用zip
。
答案 1 :(得分:5)
列表理解方式很愚蠢,因为它只包含zip
周围的无所事事列表理解:
[(i,j) for i, j in zip(lst, lst2)]
只需使用zip
,这就是它的用途。当他们没有完成任何事情时强迫自己使用列表理解是没有意义的。
编辑:如果您的问题是“我如何在一个列表理解中获得两个for循环”,那么您应该问一下。答案是“你不能在一个列表理解中获得两个PARALLEL for
循环”。每当你在列表理解中放入两个for
子句时,它们就会被嵌套。这就是这样的列表理解:
[... for a in list1 for b in list2]
像两个嵌套的for
循环一样工作:
for a in list1:
for b in list2:
...
您无法编写执行此操作的列表推导:
for a in list1:
...
for b in list2:
...
。 。 。并且你不需要,因为你有zip
函数来代替。
(你可以使用像@Roman Pekar这样的解决方案来伪造它,但这并不是真的有两个for
循环;它只做一个并使用那个中的值来到达另一个列表。)