这是我原来的答案:
>>> 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)
但是我看到 OP 似乎允许在最小 lon 值下进行多个匹配,为此,我认为没有单行。诀窍是,您只想找到一次 min(lons),而不是每个 lat,lon 对一次:
>>> 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 元素列表上的效果如何。为了可读性和长期支持,我可能会选择更明确的 2-liner 解决方案。
最后一点:有时你只能通过一个序列,例如当它是一个迭代器或生成器的输出时。为了支持多个匹配并且只通过两个列表,这是我能做的最好的:
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])