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

我有一个纬度和一个经度的列表,需要在经纬度对上迭代。

最好是:

  • A. 假设列表的长度相等:

    for i in range(len(Latitudes)):
    Lat,Long=(Latitudes[i],Longitudes[i])
    
  • B. Or:

    for Lat,Long in [(x,y) for x in Latitudes for y in Longitudes]:
    

(Note that B is incorrect. This gives me all the pairs, equivalent to itertools.product())

Any thoughts on the relative merits of each, or which is more pythonic?

194648 次浏览

这是你能得到的最简洁的描述:

for lat, long in zip(Latitudes, Longitudes):
print(lat, long)

同时遍历两个列表的元素称为 zip,python 为其提供了一个内置函数,给你对此进行了说明。

>>> 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):

很高兴在这里的答案中看到了很多对 zip的喜爱。

但是需要注意的是,如果您在3.0之前使用的是 python 版本,那么标准库中的 itertools模块包含一个返回迭代的 izip函数,在这种情况下更合适(特别是如果您的 latt/longs 列表相当长的话)。

在 python3和更高版本中,zip的行为类似于 izip

另一种方法是使用 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 相比,使用 map 的一个不同之处是,对于 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

如果你的经纬度列表很大而且懒惰地加载:

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))

这篇文章帮助我学习了 zip()。我知道我迟到了几年,但我还是想做点贡献。这是在 Python 3中。

注意: 在 Python 2.x 中,zip()返回一个元组列表; 在 Python 3.x 中,zip()返回一个迭代器。 Python 2.x 中的 itertools.izip() = = python 3. x 中的 zip()

因为看起来您正在构建一个元组列表,所以下面的代码是尝试完成您正在做的事情的最简单的方法。

>>> 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)。列表理解运行的速度也和 map()一样快,误差在几纳秒左右,并且正在成为 Python 与 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]