在Python中使用列表理解来做类似zip()的事情?

问题描述 投票:0回答:7

我是一名 Python 新手,我想做的事情之一就是专注于列表理解。我可以看到这是一个非常强大的功能,值得学习。

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

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

如何使用列表理解,以便可以将结果作为列表中的一系列列表而不是列表中的一系列元组获取?

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

(我意识到字典在这种情况下可能更合适,但我只是想更好地理解列表)。谢谢!

python list list-comprehension
7个回答
48
投票

类似这样的:

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

或者,

list
构造函数可以将元组转换为列表:

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

或者,在这种情况下,

map
函数稍微不那么冗长:

map(list, zip(cities, airports))

8
投票

如果您想完全不使用 zip 来完成此操作,则必须执行以下操作:

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

但是除了智力练习之外没有理由这样做。

使用

map(list, zip(cities, airports))
更短、更简单,而且几乎肯定会运行得更快。


5
投票

列表理解,如果没有

zip
map
itertools
的帮助,无法在多个序列上建立“并行循环”——只能在一个序列上建立简单循环,或在多个序列上建立“嵌套”循环。


3
投票

这需要

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

1
投票

也可以使用

enumerate

[[y,airports[x]] for x,y in enumerate(cities)]

0
投票

如果您想使用列表理解,并创建一个变量作为字典,这里是一个不错的方法:

newvariable = {key: value for key, value in zip(cities,airports)}

0
投票

您可以使用列表理解来组合两个列表,但是在现实世界中,您应该更喜欢内置函数(zip())而不是复杂的流语句。

zip_alternative=[ (cities[x],airports[y]) for x  in range(len(cities)) for y  in range(len(airports)) if x==y ]
© www.soinside.com 2019 - 2024. All rights reserved.