Is there a better way to iterate over two lists, getting one element from each list for each iteration?
我有一个纬度和经度的列表,需要迭代纬度和经度对。
最好是:
a.假设列表长度相等:
1
2for i in range(len(Latitudes):
Lat,Long=(Latitudes[i],Longitudes[i])b.或:
1for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]:
(注意b不正确。这给了我所有的对,相当于
有没有关于每一个的相对优点的想法,或者哪一个更像Python?
这是尽可能多的Python:
1 2 | for lat, long in zip(Latitudes, Longitudes): print lat, long |
另一种方法是使用
1 2 3 4 5 6 7 8 9 10 | >>> a [1, 2, 3] >>> b [4, 5, 6] >>> for i,j in map(None,a,b): ... print i,j ... 1 4 2 5 3 6 |
使用map与zip的一个区别是,使用zip时,新列表的长度为与最短列表的长度相同。例如:
1 2 3 4 5 6 7 8 9 10 | >>> a [1, 2, 3, 9] >>> b [4, 5, 6] >>> for i,j in zip(a,b): ... print i,j ... 1 4 2 5 3 6 |
在相同数据上使用地图:
1 2 3 4 5 6 7 8 | >>> for i,j in map(None,a,b): ... print i,j ... 1 4 2 5 3 6 9 None |
很高兴在这里的答案中看到很多对
但是需要注意的是,如果您使用的是3.0之前的python版本,那么标准库中的
在python 3和更高版本中,
如果您的纬度和经度列表较大且加载缓慢:
1 2 3 | from itertools import izip for lat, lon in izip(latitudes, longitudes): process(lat, lon) |
或者如果你想避免for循环
1 2 | from itertools import izip, imap out = imap(process, izip(latitudes, longitudes)) |
同时遍历两个列表中的元素被称为zipping,而python为它提供了一个内置函数,本文对此进行了说明。
1 2 3 4 5 6 7 8 | >>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> zipped = zip(x, y) >>> zipped [(1, 4), (2, 5), (3, 6)] >>> x2, y2 = zip(*zipped) >>> x == list(x2) and y == list(y2) True |
[示例摘自Pydocs]
在您的情况下,它只是:
1 2 | for (lat, lon) in zip(latitudes, longitudes): ... process lat and lon |
1 | for Lat,Long in zip(Latitudes, Longitudes): |
这篇文章帮助我了解了
注意:在python 2.x中,
由于看起来您正在构建一个元组列表,下面的代码是实现您正在做的工作的最Python式方法。
1 2 3 4 5 | >>> lat = [1, 2, 3] >>> long = [4, 5, 6] >>> tuple_list = list(zip(lat, long)) >>> tuple_list [(1, 4), (2, 5), (3, 6)] |
或者,如果需要更复杂的操作,也可以使用
1 2 3 4 5 6 7 8 | >>> lat = [1, 2, 3] >>> long = [4, 5, 6] >>> tuple_list = [(x,y) for x,y in zip(lat, long)] >>> tuple_list [(1, 4), (2, 5), (3, 6)] >>> added_tuples = [x+y for x,y in zip(lat, long)] >>> added_tuples [5, 7, 9] |