2013-01-31 9 views
5

私はラムダドをリストのソートに使ってみようとしています。私がしたかったのは、インアータリストからのマンハッタンの距離に基づいて座標を並べ替えることでした。私は構文の大部分を持っていることを知っているが、私は何か小さい、おかげで行方不明のように思える!Pythonでラムダを使う

while (len(queue) > 0): 
    queue.sort(queue, lambda x: util.manhattanDistance(curr,x)) 
+0

補足として、Pythonの制御文は括弧を必要としません。キュー)> 0: '。しかし、0は偽で、他の整数は存在しないので、これは 'while len(queue):'と同じです。空のシーケンスは偽で、他のシーケンスはそうではないので、これは 'while queue:'と同じです。そして、それはあなたがそれを書くべきである - それはより慣用的で、読みやすく、短く、おそらくもっと効率的です。 – abarnert

+0

私が気づいたもう一つの問題: 'queue.sort'の最初の引数として' queue'を渡しています。どんなタイプの 'キュー'があっても、それは正しくありません。 (ああ、変数 'queue'を呼び出さないでください;これは標準ライブラリモジュールの名前です) – abarnert

+0

また、' sort'はオブジェクトの長さを変更しないので、これは永遠にループします。既にソートされたリストを何度も何度も並べ替えます。 – abarnert

答えて

5

あなたがソートにキーとしてあなたラムダ関数を使用するsort()方法を教えしようとしていることが表示されます。

queue.sort(queue, key = [your lambda function])

書き換えラインは次のとおりです:

queue.sort(queue, key = lambda x: util.manhattanDistance(curr,x))

EDIT:これは、キーワード引数keyで行われ、元のラムダ関数の目的を誤解しました。距離関数が負ではないので意味がない比較関数として意図されていると思った

+1

+1。しかし、おそらく、 'lambda'を' cmp'関数として使用してOP_is_を書かれたように(2.xで)書かれているように説明する価値はありますが、それはまさにそれが動作しない理由です。 (Python 3では、コードは実際に書かれたとおりに動作します) – abarnert

+1

ああ、ありがとう。私はキーワードの引数の順序を知らなかったし、それを見たくなかった。キーワードの引数を明示的に指定するほうがはるかに安全だということです。 –

+0

明らかに同意した。より安全で、2.xと3.x(そしてIIRC、 '2to3'はこの問題を修正しません)でコードを動作させることに加えて、読みやすくなります。 _Nobody_は、注文が何であるかを覚えています。 'cmp'関数をキーワードなしで使用する唯一の理由は、Python 2.3以前と互換性がある必要がある場合です。 – abarnert

関連する問題