出力する内容によって異なります。まず、あなたはif
条件は(有効な構文の中に)あなたが望むように複雑になることが「範囲」
gen = (x for x in lists if x[0] > 10000)
に基づいてリストをフィルタリングする必要があります。例:
gen = (x for x in lists if 5000 < x[0] < 10000)
完全に問題ありません。あなたがサブリストからのみ第二の要素たい場合
今、:あなたは全体のサブリストをしたい場合は
min(x[1] for x in lists if x[0] > 10000)
:もちろん
min(x[1] for x in gen)
を、あなたは全部をインライン可能性:
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)]
を使用すると、以下のN
マッチが存在することを確実にわかっている場合は、heapq
とitertools.takewhile
でより効率的に、この小さなを行うことができます。一致数の上限がわからない一般的なケースでは、この解決策はより良いと思います(ソートと比較してO(N)ですが、O(NlogN)です)。
それはあなたのコメントのための
すばらしい答え。うん、帰りたい[10787、9] itemgetterを読んだ。私は、ジェネレータの表現が枯渇しているということに従わない。何らかの理由でそれをもう一度繰り返すことはできないのですか? – Paul
@Paul - そうです。ジェネレータは一度しか反復できません。通常これは問題ではありません(別のものを作成することはできます)。しかし、問題がある場合は、代わりにリストの理解を使うことができます: 'lst = [x [0]> 10000ならリストのxのx ')' – mgilson
ああ、完璧です。ありがとう。リストの理解に詳しい私は括弧とは別の違いを見ることができない、私はジェネレータとの違いに読んでいる必要があります、ありがとう。 – Paul