我是一个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']]
(我知道在这种情况下字典可能更合适,但我只是想更好地理解列表)。谢谢!
答案 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)
如果没有zip
,map
或itertools
的帮助,列表理解就无法在多个序列上形成“并行循环” - 只有一个序列上的简单循环,或者多个“嵌套”循环。
答案 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