有没有更好的方法来迭代两个列表,每个迭代从每个列表中获取一个元素?

我有一个纬度列表和一个经度,需要遍历经纬度对。

是更好的:

  • 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]