我有纬度列表和经度列表,需要迭代纬度和经度对。
是否更好:
一个。假设列表长度相等:
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?
答案 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]