这是我的原始答案:
>>> lats = [1,2,3,4]
>>> lons = [5,4,8,9]
>>> from itertools import izip
>>> min(izip(lats,lons), key=lambda x:x[1])
(2, 4)
但我看到原帖似乎允许最小经度值有多个匹配项,对于这种情况,我认为没有一行代码可以解决。关键在于,你只想找到一次 min(lons),而不是每个纬度和经度对都找一次:
>>> lats = [1,2,3,4]
>>> lons = [5,4,8,4]
>>> minlon = min(lons)
>>> [(lat,lon) for lat,lon in izip(lats,lons) if lon==minlon]
[(2, 4), (4, 4)]
这个一行代码可能适合你,因为 lambda 参数 minlon 只需要计算一次:
>>> filter(lambda latlon,minlon=min(lons):latlon[1]==minlon, izip(lats,lons))
[(2, 4), (4, 4)]
不确定它在420481元素列表上的表现如何。为了可读性和长期支持,我可能会选择更明确的两行解决方案。
最后一点:
有时您只能通过一个序列进行一次遍历,例如当它是迭代器或生成器的输出时。为了支持多个匹配并仅通过两个列表进行一次遍历,这是我所能做的最好的:
from itertools import izip
def get_lats_at_min_lon(lats, lons):
minlon = 200
minlats = []
for lat,lon in izip(lats, lons):
if lon < minlon:
minlats = [lat]
minlon = lon
elif lon == minlon:
minlats.append(lat)
return minlon, minlats
lats = iter([1,2,3,4])
lons = iter([5,4,8,4])
print get_lats_at_min_lon(lats,lons)
输出:
(4, [2, 4])
x=min(zip(range(10**6)))
пјӣеңЁPython3дёӯпјҢzip
еҫҲеҝ«пјҢиҖҢеңЁPython2дёӯпјҢizip
еҗҢж ·еҝ«пјҢиҖҢzip
йқһеёёж…ўгҖӮ - ninjagecko