2010-01-30 78 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)] 
相关问题