2010-01-30 26 views
7

Tôi là một newbie Python và một trong những điều tôi đang cố gắng làm là quấn đầu của tôi xung quanh danh sách hiểu. Tôi có thể thấy rằng đó là một tính năng khá mạnh mẽ đáng để học hỏi.Sử dụng tính năng đọc danh sách bằng Python để thực hiện điều gì đó tương tự như zip()?

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

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

Làm cách nào để sử dụng tính năng đọc danh sách để tôi có thể nhận kết quả dưới dạng một danh sách trong danh sách chứ không phải một loạt các danh sách trong danh sách?

[['Chicago', 'ORD'], ['Detroit', 'DTW'], ['Atlanta', 'ATL']] 

(Tôi nhận thấy từ điển có thể phù hợp hơn trong tình huống này, nhưng tôi chỉ đang cố gắng hiểu danh sách tốt hơn một chút). Cảm ơn!

Trả lời

26

Something như thế này:

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

Cách khác, các nhà xây dựng list có thể chuyển đổi các tuple vào danh sách:

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

Hoặc, các map chức năng là hơi ít tiết trong trường hợp này:

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

Điều này có nghĩa là zip đầu ra và 's chuyển đổi tất cả các bộ vào các danh sách:

map(list, zip(cities, airports)) 

Đối với hiệu suất của mỗi:

$ 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: Các OP hỏi đặc biệt cho một sự hiểu biết danh sách. –

4

Một danh sách hiểu biết, nếu không có sự giúp đỡ từ zip, map, hoặc itertools, không thể lập nên một " vòng lặp song song "trên nhiều chuỗi - chỉ các vòng lặp đơn giản trên một chuỗi hoặc vòng" lồng nhau "trên nhiều chuỗi.

+0

Nó có thể được thực hiện như Dave Kirby đã chứng minh – inspectorG4dget

5

Nếu bạn muốn làm điều đó mà không sử dụng zip ở tất cả, bạn sẽ phải làm một cái gì đó như thế này:

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

nhưng không có lý do để làm điều đó khác hơn là một bài tập trí tuệ.

Sử dụng map(list, zip(cities, airports)) ngắn hơn, đơn giản hơn và gần như chắc chắn sẽ chạy nhanh hơn.

+0

Mặt khác, sử dụng một danh sách hiểu và một zip với nhau chỉ là ngắn, và với tôi ít nhất, thậm chí đơn giản hơn. Bạn có biết rằng hiệu suất của nó sẽ so sánh với bản đồ như thế nào? –

0

Có thể sử dụng enumerate, cũng như:

[[y,airports[x]] for x,y in enumerate(cities)] 
Các vấn đề liên quan