これが私の元の答えでした:
>>> 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 値で複数の一致が許可されているように見えます。このため、ワンライナーはないと思います。秘訣は、緯度と経度のペアごとに 1 回ではなく、min(lons) を 1 回だけ見つけたいということです。
>>> 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 ライナー ソリューションを選択します。
最後のポイント: イテレーターの場合やジェネレーターの出力の場合など、シーケンスを介して 1 つのパスしか得られない場合があります。複数の一致をサポートし、2 つのリストを 1 回だけ通過させるには、これが最善の方法でした。
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])