如何在python中使用list comprehension从列表中获取元组

时间:2013-09-24 19:13:01

标签: python list tuples list-comprehension

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

2 个答案:

答案 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循环;它只做一个并使用那个中的值来到达另一个列表。)