
No.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の方が楽に書けるような例もあります。
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の方が楽に書けるような例もあります。
No.1
- 回答日時:
> 辞書のキーを基準にして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と全く同じ効果をもたらすものです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Google Apps Script、onChange...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
SQLエラーについて
-
キャッシュを使わずにSELECTを...
-
ODBCリンクの際にACCESSでは読...
-
SQL*Loaderでのsysdate使用
-
callで順に実行されるプロシー...
-
【Excel VBA】 WorksheetやRa...
-
Access VBAで行ラベルが定義さ...
-
sqlplusでヘッダーが付かない
-
重複するIDのデータを1行にま...
-
DB2でのシステム日付のinsert、...
-
SQLで部分的にGROUP BYしたいとき
-
エクセルVBAでUserFormを起動し...
-
ACCESS、時間ごとの集計の仕方は?
-
今日の日付が入った行のデータ...
-
ストアドプロシジャからストア...
-
likeとsubstrの使いわけについて
-
PL/SQLでSPOOLさせたいのですが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
医は仁術ですか算術ですか
-
pythonの辞書のソートで
-
Google Apps Script、onChange...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
キャッシュを使わずにSELECTを...
-
callで順に実行されるプロシー...
-
sqlplusでヘッダーが付かない
-
ODBCリンクの際にACCESSでは読...
-
PL/SQLカーソルの2重FORループ...
-
Accessの数値から時間に変換す...
-
エクセルVBAでUserFormを起動し...
-
WHERE句の実行順序
-
【Excel VBA】 WorksheetやRa...
-
SQLで部分的にGROUP BYしたいとき
-
重複するIDのデータを1行にま...
-
OutlookVBAで作成したマクロに...
-
今日の日付が入った行のデータ...
-
sqlplusのspoolで空白行出現
おすすめ情報