2010-01-30 70 views
7

我是一個Python新手,我想要做的事情之一是圍繞列表理解。我可以看到這是一個非常強大的功能,值得學習。在Python中使用list comprehension來做類似於zip()的事情?

cities = ['Chicago', 'Detroit', 'Atlanta'] 
airports = ['ORD', 'DTW', 'ATL'] 

print zip(cities,airports) 
[('Chicago', 'ORD'), ('Detroit', 'DTW'), ('Atlanta', 'ATL')] 

如何使用列表理解這樣我就可以得到結果列表中的一系列列表,而不是一個列表中的一系列元組? (我知道字典在這種情況下可能會更合適,但我只是試圖理解列表更好一點)。謝謝!

回答

26

事情是這樣的:

[[c, a] for c, a in zip(cities, airports)] 

或者,list構造可元組轉換成列表:

[list(x) for x in zip(cities, airports)] 

或者,map功能是在這種情況下稍微更簡潔:

map(list, zip(cities, airports)) 
1

這需要zip的輸出,並將所有元組列表:

map(list, zip(cities, airports)) 

對於每個性能:

$ python -m timeit -c '[ [a, b] for a, b in zip(xrange(100), xrange(100)) ]' 
10000 loops, best of 3: 68.3 usec per loop 

$ python -m timeit -c 'map(list, zip(xrange(100), xrange(100)))' 
10000 loops, best of 3: 75.4 usec per loop 

$ python -m timeit -c '[ list(x) for x in zip(range(100), range(100)) ]' 
10000 loops, best of 3: 99.9 usec per loop 
+0

-1:在OP特別要求列表理解。 – 2010-01-30 23:39:29

4

列表理解,而不zipmap,或itertools一些幫助,不能制定一個「並行循環「 - 在一個序列上只有簡單的循環,或在多個序列上的」嵌套「循環。

+0

可以這樣做,因爲Dave Kirby已經證明 – inspectorG4dget 2010-01-31 01:25:24

5

如果你想做到這一點,而無需使用拉鍊的一切,你會做這樣的事情:

[ [cities[i],airports[i]] for i in xrange(min(len(cities), len(airports))) ] 

,但沒有理由這樣做除智力練習。

使用map(list, zip(cities, airports))更短,更簡單,幾乎肯定會運行得更快。

+0

另一方面,一起使用列表理解和zip一樣簡短,至少對我來說更簡單。你碰巧知道它的表現與地圖相比如何? – 2010-01-30 23:41:19

0

可以使用enumerate,以及:

[[y,airports[x]] for x,y in enumerate(cities)] 
相關問題