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

Is there a better way to iterate over two lists, getting one element from each list for each iteration?

本问题已经有最佳答案,请猛点这里访问。

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

最好是:

  • a.假设列表长度相等:

    1
    2
    for i in range(len(Latitudes):
        Lat,Long=(Latitudes[i],Longitudes[i])
  • b.或:

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

(注意b不正确。这给了我所有的对,相当于itertools.product()

有没有关于每一个的相对优点的想法,或者哪一个更像Python?


这是尽可能多的Python:

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


另一种方法是使用map

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


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

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

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


如果您的纬度和经度列表较大且加载缓慢:

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


这篇文章帮助我了解了zip()。我知道我晚了几年,但我仍然想贡献自己。这是在Python3中。

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

由于看起来您正在构建一个元组列表,下面的代码是实现您正在做的工作的最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)]

或者,如果需要更复杂的操作,也可以使用list comprehensions(或list comps)。列表理解的速度也和map()一样快,只需几纳秒,并且正在成为被认为是Python对map()的新标准。

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]