2013-09-24 46 views
8

我有两个列表,并希望将它们合并到一个列表tuples中。我想用list comprehension来完成,我可以使用map来实现它。但很高兴知道这里的列表理解如何工作。这里 代码如何从列表中使用Python中的列表理解获取元组

>>> 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-looplist comprehension

回答

13

将列表推导考虑为循环。你怎么能写2不嵌套循环?

你可以稍微奇怪列表理解这样做:

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

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

但实际上,它是更好地使用zip

+1

很好的解决方案,我想知道是否以及如何在列表理解中获得两个for循环 – eagertoLearn

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's这样的解决方案来伪造它,但这并不是真的做了两个for循环;它只是做一个并使用其中的值进入另一个列表。)

+0

这相当于使用zip(lst,lst2)。 (1,6),(2,7),(3,1,2)和(1,2)都不需要[(i,j) (1,6),(2,7),(4,9),(5,10)] >>> [(i,j)for i,j in zip(lst,lst2)] [ ,(3,8),(4,9),(5,10)]'我想在不使用'zip'的情况下实现这个功能 – eagertoLearn

+0

@ user2708477为什么你不想使用zip? –

+0

@RomanPekar:正如我的问题所说,我想使用列表理解,因为我想知道如何在列表理解中获得两个for-loops,但我确实知道zip如何工作,并且与zip一起使用相当简单 – eagertoLearn