9

我有两个列表,想将它们合并到一个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

4

2 回答 2

16

将列表推导视为循环。你怎么能写 2 个非嵌套循环?

你可以用有点奇怪的列表理解来做到这一点:

[(x, lst2[i]) for i, x in enumerate(lst)]

或者

[(lst[i], lst2[i]) for i in xrange(len(lst))]

但实际上,最好使用zip.

于 2013-09-24T19:17:09.963 回答
6

列表理解的方式很愚蠢,因为它只是包装了一个无操作的列表理解zip

[(i,j) for i, j in zip(lst, lst2)]

只需使用zip,这就是它的用途。当列表推导没有完成任何事情时,强迫自己使用列表推导是没有意义的。

编辑:如果您的问题是“我如何在一个列表理解中获得两个 for 循环”,那么您应该问这个问题。答案是“你不能for在一个列表理解中得到两个 PARALLEL 循环”。任何时候你将两个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's 这样的解决方案来伪造它,但这并没有真正做两个for循环;它只做一个并使用来自那个的值进入另一个列表。)

于 2013-09-24T19:14:46.380 回答