15

我是一个 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']]

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

4

6 回答 6

40

像这样的东西:

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

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

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

或者,map在这种情况下,该函数稍微不那么冗长:

map(list, zip(cities, airports))
于 2010-01-30T22:05:44.803 回答
7

如果您想在不使用 zip 的情况下完成此操作,则必须执行以下操作:

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

但除了智力锻炼之外,没有理由这样做。

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

于 2010-01-30T23:33:23.333 回答
4

如果没有, 或的帮助zip,列表推导无法在多个序列上建立“并行循环”——只有一个序列上的简单循环,或多个序列上的“嵌套”循环。mapitertools

于 2010-01-30T22:10:20.160 回答
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
于 2010-01-30T22:08:41.490 回答
1

也可以使用enumerate

[[y,airports[x]] for x,y in enumerate(cities)]
于 2017-03-23T18:41:19.047 回答
0

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

newvariable = {key: value for key, value in zip(cities,airports)}
于 2021-11-08T01:38:00.727 回答