これは、出力に必要なものによって異なります。まず、「範囲」に基づいてリストをフィルタリングする必要があります1
gen = (x for x in lists if x[0] > 10000)
条件は、if
(有効な構文内で) 必要に応じて複雑にすることができます。例えば:
gen = (x for x in lists if 5000 < x[0] < 10000)
全然大丈夫です。
ここで、サブリストの 2 番目の要素のみが必要な場合:
min(x[1] for x in gen)
もちろん、全体をインライン化することもできます:
min(x[1] for x in lists if x[0] > 10000)
サブリスト全体が必要な場合:
from operator import itemgetter
min(gen,key=itemgetter(1))
例:
>>> lists = [[10564, 15], [10564, 13], [10589, 18], [10637, 39], [10662, 38], [10712, 50], [10737, 15], [10762, 14], [10787, 9], [10812, 12], [10837, 45], [3, 17], [7, 21], [46, 26], [48, 12], [49, 24], [64, 14], [66,17], [976, 27], [981, 22], [982, 22], [983, 17], [985, 13], [517, 9], [521, 15], [525, 11], [526, 13], [528, 14], [698, 14], [788, 24], [792, 19]]
>>> gen = (x for x in lists if x[0] > 10000)
>>> min(x[1] for x in gen)
9
>>> gen = (x for x in lists if x[0] > 10000)
>>> from operator import itemgetter
>>> min(gen,key=itemgetter(1))
[10787, 9]
残念ながら、これらは条件に一致する最初のサブリストしか提供しません。それらをすべて取得するには:
target = min(x[1] for x in lists if x[0] > 10000)
matches = [x for x in lists if (x[1] == target) and (x[0] > 10000)]
一致する数よりも少ないことが確実にわかっている場合は、 andN
を使用してこれをもう少し効率的に行うことができます。一致数の上限がわからない一般的なケースでは、このソリューションの方が優れていると思います (O(NlogN) である並べ替えと比較して O(N) です)。heapq
itertools.takewhile
1「ジェネレーター式」は、使い果たされる前に 1 回しか反復できないことに注意してください。