2013-09-24 126 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

相關問題