アルゴリズム(Python):kより大きい最小の数を見つける

アルゴリズムの観点から質問があります。 私は数字のリスト(浮動小数点数)を持っています

1.22,3.2, 4.9,12.3.....and so on

そして私は最も小さい数を見つけることを望んでいる(言うことができる)4 .. だから答えは4.9です しかし、明白な解決策のほかに(リストを繰り返して、kよりも小さな番号のトラックを維持する)、これを行うための "pythonic way"は何ですか? ありがとう

7
追加された
ビュー: 1

4 答え

min(x for x in my_list if x > 4)
15
追加された
@アンバー:まあ、他に何をすべきですか? :)
追加された 著者 Sven Marnach,
確かに、これはあなたがOPで述べたこととまったく同じです(「kよりも小さい番号のリストを繰り返しています」)。これは単なるコンパクトな方法です。
追加された 著者 Amber,
@SvenMarnach - あなたの答えに間違いがあったということを言っているわけではありませんでした。質問者には、構文的な砂糖だけであることを指摘しています。反復よりも魔法的に効率的なものではありません。
追加された 著者 Amber,
私はちょうど同じ質問をしました。受け入れられた答えを読んでちょっと私を憂鬱にしました。誰が他のところで掘りたいと思っていますか?それから私はこれを見ました。文法的な砂糖かどうか、それはまだ甘いです。
追加された 著者 Noich,

バイナリ検索はこれに対処するための標準的な方法ですが、リストがソートされている場合のみ、前の回答が指摘したとおりです。

See Python binary search-like function to find first number in sorted list greater than a specific value

and In Python, how do you find the index of the first value greater than a threshold in a sorted list?

for discussion of a module that does this for you: http://docs.python.org/library/bisect.html

8
追加された
バイセクト関数の+1
追加された 著者 joaquin,

これはフィルタの完璧なシナリオです。

>>> L = [1.22, 3.2, 4.9, 12.3]
>>> k = 4
>>> a = min(filter(lambda x: x > k, L))
>>> print(a)
4.9

リスト内包表記を使用することもできます。

>>> L = [1.22, 3.2, 4.9, 12.3]
>>> k = 4
>>> a = min([element for element in L if element > k])
>>> print(a)
4.9

リストの理解度は、最初のビューではそれほど単純ではないように思われますが、それを実行するための推奨方法です。いくつかのPython開発者によれば、 filter は使用しないでください。

ジェネレータ式は、リストを作成しないため、さらに優れていますメモリ:

>>> L = [1.22, 3.2, 4.9, 12.3]
>>> k = 4
>>> a = min(element for element in L if element > k)
>>> print(a)
4.9
5
追加された

私はPythonについては分かりませんが、アルゴリズムの観点からは何かを追加することができます。あなたの例では、リストは単調増加(ソート)されています。それがあなたのリストに常に当てはまる場合、小さな最適化は、4より大きな数に達すると反復を止めることかもしれません。

あなたのリストが常に4より小さい数を持っていない場合、これは最適な最適化になりますが、目標数の前後の項目の数がランダムであれば、この改善は信頼できません。

その場合、リストをパーティション分割して検索することができます。中間要素が4より大きいかどうかをテストします。大きい場合は上半分をスローし、そうでない場合は下半分をスローします。新しい半分の長さのリストで同じことをしてください。あなたは、偶数と奇数を扱う必要があります。リストセグメントに1〜2つのアイテムしか残っていない場合もあります。大きなリストの場合、これによりテストの数が大幅に削減されるはずです。

2
追加された