在Python中使用list comprehension做类似于zip()的事情?

时间:2010-01-30 22:03:43

标签: python list list-comprehension

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

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

5 个答案:

答案 0 :(得分:29)

这样的事情:

[[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 :(得分:5)

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

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

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

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

答案 2 :(得分:4)

如果没有zipmapitertools的帮助,列表理解就无法在多个序列上形成“并行循环” - 只有一个序列上的简单循环,或者多个“嵌套”循环。

答案 3 :(得分: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

答案 4 :(得分:0)

也可以使用lbCategories.DataTextField = ds.Tables[0].Columns["catName"].ColumName; lbCategories.DataValueField = ds.Tables[0].Columns["catID"].ColumnName;

enumerate