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

时间:2009-12-17 02:00:55

标签: python list iteration

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

是否更好:

  • 一个。假设列表长度相等:

    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?

7 个答案:

答案 0 :(得分:237)

这就像你可以获得的pythonic一样:

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

答案 1 :(得分:47)

另一种方法是使用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

答案 2 :(得分:21)

很高兴在这里看到很多对zip的热爱。

但是应该注意,如果你在3.0之前使用python版本,标准库中的itertools模块包含一个izip函数,它返回一个iterable,在这种情况下更合适(特别是如果你的格子/长片列表很长)。

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

答案 3 :(得分:15)

如果您的纬度和经度列表很大且延迟加载:

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

答案 4 :(得分:6)

同时迭代两个列表的元素称为压缩,python为它提供内置函数,记录为here

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

答案 5 :(得分:5)

for Lat,Long in zip(Latitudes, Longitudes):

答案 6 :(得分:3)

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

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

由于您看起来正在构建元组列表,因此以下代码是尝试完成您正在做的事情的最pythonic方式。

>>> 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()一样快,给出或花费几纳秒,并且正在成为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]