質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

python sort()の引数に key = 関数 を使用して実行したいのですが

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,730

nobita

score 46

l = [(1, 5), (-2, -5), (8, 9), (-8, 10)]
# l を点 (-3, 5) から近い順に並べ替えてください。


#解答→[(1, 5), (-8, 10), (-2, -5), (8, 9)]


def ma(i,j):
    r  = (-3 - i ) ** 2 + (5 - j) ** 2

    return r




for i,j in l:
    m = ma(p,k)

    l.sort(key = ma(p,k))

print(l)

おはようございます。
上記の問題を解いています。
ソートの学習と関数の学習をおこなっており、lのリストない(x,y)軸が基準軸の(-3,5)から近い順に並び替える問題です。
そのとき、sort(key = ?)の形式でコードを記述するのですが、いまいちうまく動きません。
for文を使用し、各箇所の拠点からの距離を求め、リストに追加し、それをソートしましたが、それだと問題の趣旨に反していてNGです。。。

どなたかアドバイスをお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

sortedのkeyに指定できるのは、引数が単一の関数オブジェクトです。
比較関数の引数の扱いを変える必要があります。

>>> l = [(1, 5), (-2, -5), (8, 9), (-8, 10)]
>>>
>>> def ma(pt):
...     i, j = pt
...     return (-3 - i)**2 + (5 - j)**2
...
>>> sorted(l, key=ma)
[(1, 5), (-8, 10), (-2, -5), (8, 9)]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/28 12:09

    回答ありがとうございます。
    引数が単一のオブジェクトとは、つまり、 関数(a,b)のようではNGで、 関数(ab)のように引数が1つの場合はOKという認識でよろしいんでしょうか??

    キャンセル

  • 2018/09/28 13:44

    そういうことです。

    キャンセル

  • 2018/09/28 15:03

    なるほど!!!
    すっきりしました!!!!
    ありがとうございました!!!!

    キャンセル

+3

こんにちは。

考え方の順序としては、まず初めに、2点間の距離を求める関数を作ります。

import math

def distance(p1, p2):
    return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

この distance を使うとたとえば、(1, 1) と (4, 5) の距離は以下のように求められます。

distance((1, 1), (4, 5))   # => 5.0

次に、l を sortするときの key として、以下のように lambdaを使い、l の要素である各点pと (-3, 5)との距離がソートキーになるように指定します。

l = [(1, 5), (-2, -5), (8, 9), (-8, 10)]

l.sort(key=lambda p: distance(p, (-3, 5)))

print(l)  # => [(1, 5), (-8, 10), (-2, -5), (8, 9)]

なお、 距離でソートしたいだけであれば、 ソートキーとする値を求める関数として distance から平方根を計算することを省いた、

def squared_distance(p1, p2):
    return (p1[0] - p2[0])**2 + (p1[1] - p2[1])**2

を使ってもソート結果は同じです。なぜなら、 

0以上の実数 x,y  について、

xの平方根 >= yの平方根 ⇔ x >= y

が成り立つ。

からです。

以上、参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/28 12:11

    回答ありがとうございます。
    細かく丁寧に教えて頂き助かります。
    ライブラリを使用した方法も試してみようと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る