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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

6032閲覧

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

nobita

総合スコア66

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/27 22:41

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です。。。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

Python

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

投稿2018/09/27 23:06

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobita

2018/09/28 03:09

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

2018/09/28 04:44

そういうことです。
nobita

2018/09/28 06:03

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

0

こんにちは。

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

Python

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

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

Python

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

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

Python

1l = [(1, 5), (-2, -5), (8, 9), (-8, 10)] 2 3l.sort(key=lambda p: distance(p, (-3, 5))) 4 5print(l) # => [(1, 5), (-8, 10), (-2, -5), (8, 9)]

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

Python

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

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

0以上の実数 x,y について、 xの平方根 >= yの平方根 ⇔ x >= y が成り立つ。

からです。

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

投稿2018/09/27 23:30

編集2018/09/27 23:47
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nobita

2018/09/28 03:11

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問