有没有更好的方法来迭代两个列表,每个迭代从每个列表中获取一个元素?
我有一个纬度列表和一个经度,需要遍历经纬度对。
是更好的:
-
A.假设列表长度相同:
for i in range(len(Latitudes): Lat,Long=(Latitudes[i],Longitudes[i])
-
B.或者:
for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]:
(注意B是不正确的,这给了我所有的对,相当于itertools.product()
)
对每一个的相对优点,还是更pythonic的任何想法?
这是python,你可以得到:
for lat, long in zip(Latitudes, Longitudes): print lat, long
另一种方法是使用map
。
>>> 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
与zip相比,使用地图的一个区别是,使用zip的新列表的长度是
与最短列表的长度相同。 例如:
>>> 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
在相同的数据上使用地图:
>>> for i,j in map(None,a,b): ... print i,j ... 1 4 2 5 3 6 9 None
在这里的答案很zip
看到很多zip
的爱。
但是应该注意的是,如果你在3.0之前使用python版本,标准库中的itertools
模块包含一个izip
函数,该函数返回一个iterable,在这种情况下更适合(尤其是如果你的latt / longs列表是相当的长)。
在python 3和更高版本的zip
行为就像izip
。
如果您的纬度和经度列表很大并且延迟加载:
from itertools import izip for lat, lon in izip(latitudes, longitudes): process(lat, lon)
或者如果你想避免for循环
from itertools import izip, imap out = imap(process, izip(latitudes, longitudes))
同时迭代两个列表的元素被称为压缩,python提供了一个内置的函数,这是在这里logging 。
>>> 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为例]
就你而言,这将是简单的:
for (lat, lon) in zip(latitudes, longitudes): ... process lat and lon
for Lat,Long in zip(Latitudes, Longitudes):
这个post帮助我与zip()
。 我知道我晚了几年,但我仍然想要贡献。 这是在Python 3中。
注意:在Python 2.x中, zip()
返回一个元组列表; 在Python 3.x中, zip()
返回一个迭代器。 python 2.x中的itertools.izip()
== python 3.x中的zip()
由于看起来您正在构build元组列表,因此下面的代码是尝试完成您正在做的事情的最有趣的方法。
>>> lat = [1, 2, 3] >>> long = [4, 5, 6] >>> tuple_list = list(zip(lat, long)) >>> tuple_list [(1, 4), (2, 5), (3, 6)]
或者,如果您需要更复杂的操作,则可以使用list comprehensions
(或list comps
)。 列表parsing的运行速度与map()
一样快,需要几个纳秒,并正在成为Pythonic与map()
的新规范。
>>> 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]