海外旅行から帰ってきたら、まず何を食べる?

pythonの辞書のソートについて教えてください
辞書のキーを基準にしてmaxしろといことは実行すればわかりますが
以下の文のdic[x]の[x]は何んですか?

dic = {"A": 1, "B": 2}
max(dic, key=lambda x: dic[x])

よろしくお願いします

A 回答 (2件)

https://docs.python.jp/2.7/library/functions.htm …
https://docs.python.jp/3/library/functions.html# …

辞書は、イテレータとして使うと、 キーを順番に返します。
for i in dic: print(i)
などで確認できます。
https://docs.python.jp/3/library/stdtypes.html#d …
> iter(d)
> 辞書のキーに渡るイテレータを返します。これは iter(d.keys()) へのショートカットです。


max関数は、key引数を指定しなければ、イテレータからの値そのもので比較して、最大のものを返します。
このdicだと 'A' , 'B' のうち、最大を選びます。


keyに関数が指定されると、イテレータからの値を指定した関数に与えて、その戻り値で比較します。
max(dic, key=func1)
だと
func1('A') , func1('B')
を比較して、最大値を探します。
ただし、maxが返すのは、元のイテレータからの値、この例では'A'か'B'になります。


ここで、いちいちfunc1を定義するのも大変です。
そういうときに、無名の関数を用意することができます。
このとき使うのが lambda です。(ラムダと読みます)

lambda x: dic[x]
だと、引数は x 一つ、戻り値は dic[x] という関数、ということです。
このラムダ式を L だとすると、
L('A') , L('B')
を比較することになります。その中身は dic[x]ですから、それぞれ
dic['A'] , dic['B']
と同じになります。このうちの最大を探すことになります。


lambdaはうまく使うととても便利です。
lambdaの方が楽に書けるような例もあります。
    • good
    • 1
この回答へのお礼

ありがとうございました

お礼日時:2018/01/25 15:02

> 辞書のキーを基準にしてmaxしろといことは実行すればわかります



違いますね。
辞書のキーを基準にしてるんじゃなくって、辞書の値を基準にしろ、って言ってるんです。

例示のコードがちと明解じゃないんで、次のようにしてみます。

dic = {"A":1, "B": 3, "C": 2}

キーとして考えるとA, B, Cの中ではCが最大です。値では3が最大ですね。
そこで、こう言う演算をさせると

>>> max(dic, key = lambda x: dic[x])
'B'

3が最大の値として(Bに)アサインされてるので、Bが返ってきます。

ところで、

lambda x: dic[x}

みたいな形式をラムダ式と呼んで、これは「無名関数」等と言われるものです。
これは外部的に例えば、

def key_func(x):
  return dic[x]

等と定義して

>>> max(dic, key = key_func)
'B'

と演算させるのと同じ効果をもたらします。一々外部で関数を定義するのがメンド臭い場合、こうやってラムダ式で内部的に「関数をワンライナーで記述する」と言う事を良くやるわけです。
つまり、dic[x]のxはlambda式の引数xを受け取るようになってて、それは外部的に上記のようにkey_func関数を定義した場合の引数xと全く同じ効果をもたらすものです。
    • good
    • 1
この回答へのお礼

ありがとうございました

お礼日時:2018/01/25 15:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報