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

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

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

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

Q&A

解決済

2回答

559閲覧

sortedに辞書オブジェクトdを渡して、keyにd.getを指定した時の挙動

konishi201102

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2021/10/18 22:47

編集2021/10/18 22:49

表題の件について、

list=sorted(d,key=d.get)

というようなコードがあり、どう挙動するのかをご教示ください。
d = {'1':'a','2':'b','3':'c','4':'d'}
というような辞書です。

sorted関数はタプルを並べ替えてリストを生成することができるみたいなので、
辞書についてもkeyの関数の処理に従って並び替えて結果をリストで返すのかなと思いましたが、
keyに指定されているgetメソッドの挙動がわかりません。
getメソッドはkeyの指定が必須の様なのですが、sortedのkeyにしたときには何が引数として渡されるのでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

sorted関数は、シーケンス(文字列、タプルまたはリスト)やその他の反復可能なオブジェクト (iterable) を引数に取り、その要素を並べ替えた新たなリストを返します[^1]。

辞書も反復可能なオブジェクトですが、反復されるのはキーと値の組ではなく、キーです。
そのためsorted関数に辞書を渡すと、キーがソートされリストとなって返されます。

python

1>>> d = {2:"two", 0:"zero", 3:"three", 1:"one"} 2>>> for k in d: 3... print(k) 4... 52 60 73 81 9>>> sorted(d) 10[0, 1, 2, 3]

sorted関数のkeyに関数を指定すると、まず反復可能なオブジェクトの各要素がその関数に渡され、それぞれ返り値を得ます。すべての要素について返り値が出揃うと、この値を使って比較が行われ、ソートが行われます。ソートの結果は、関数に渡す前の要素を並べ替えたリストとして返されます。

python

1>>> for k in d: 2... print(d.get(k)) 3... 4two 5zero 6three 7one 8>>> sorted([d.get(k) for k in d]) 9['one', 'three', 'two', 'zero'] 10>>> sorted(d, key=d.get) 11[1, 3, 2, 0]

参考:Python HOWTO » ソート HOW TO » Key 関数

[1] https://docs.python.org/ja/3.9/library/functions.html#sorted

投稿2021/10/19 00:52

etherbeg

総合スコア1195

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

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

0

以下の実行結果でわかるとおり、辞書の各要素のキー(1など)が渡されます。
よってd.get(キー)の戻り値、すなわち辞書の値(aなど)によってソートされます。
また、ソートされた結果のリストの要素は(辞書の値ではなく)辞書のキーとなります。

Python

1d = {'1':'a','2':'b','3':'c','4':'d'} 2 3def f(v): 4 print(v) 5 return v 6 7sorted(d, key=f) 8 9# 1 10# 2 11# 3 12# 4 13 14print( sorted(d, key=d.get)) 15# ['1', '2', '3', '4']

投稿2021/10/19 00:37

can110

総合スコア38262

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問