Вот мой первоначальный ответ:
>>> 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)
Но я вижу, что ОП, казалось, допускает наличие нескольких совпадений при минимальном значении 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)]
Этот однострочный может работать на вас, так как аргумент лямбда minlon долженвычисляется один раз:
>>> filter(lambda latlon,minlon=min(lons):latlon[1]==minlon, izip(lats,lons))
[(2, 4), (4, 4)]
Не уверен, насколько хорошо он будет работать со списками из 420481 элементов.А для удобочитаемости и долгосрочной поддержки я бы, вероятно, выбрал более явное 2-строчное решение.
Последний пункт: иногда вы получаете только один проход через последовательность, например, когда это итератор иливыход генератора.Для поддержки нескольких совпадений и выполнения только одного прохода через два списка это было лучшее, что я мог сделать:
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])