前置き
まず、この問題に直面したのはjupyterでDataFrameに対し、df.applyメソッドの練習を行なっていたときでした。
df.apply(lambda x: len(x['name']) + len(x['genre']), axis=1).head()
という操作を行い、nameとgenreの文字数を合計するというものでした。
lambda関数を知らなかったので、勉強しました。
a = lambda x: x*2 print(a(5)) >>> 10
というように、引数xとそれに対する式を指定することで、無名の関数を作れると学びました。
そして、そこでsorted()と組み合わせて使うのが代表的な使い方のようだったので、そちらも勉強してみました。
sorted()の第二引数には関数をkeyという名の引数として入れられるようで、それがlambda関数がよく用いられるということだそうです。
そのkeyの使い方がよくわかりません。
#本題
公式には以下のようにkeyについて記述してありました。
key パラメータは単一の引数をとり、ソートに利用される key を返さなければいけません。この制約によりソートを高速に行えます
よくわからなかったのですが、自分の中では、keyに定義した関数をsorted()を行うイレラブルな各要素全てに対して行ってから、sorted()すると解釈しました。
確かに以下のコードでは、リストの各要素を小文字にして、sortしています。
sort_list = sorted("This is a test string from Andrew".split(), key=str.lower) print(sort_list) >>>['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] sort_list2 = sorted("This is a test string from Andrew".split()) print(sort_list2) >>>['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
しかし、公式で書かれていた例でlambdaを使用した以下のようなものがありました。
student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),] sorted(student_tuples, key=lambda student: student[2]) # sort by age >>>[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
たぶん、リストの中のtupleの要素でどれでsortするかをlambda関数は指定してると思うのですが、lambda関数の引数のstudentの働きがよくわかりません。
前置きのようにx = 2のように、studentには具体的な引数を渡していないのに、正常に動いています。
jupyterの方のlambdaと似たような状況なのですが、lambdaの引数になにも渡してないのに、コードがなぜ正常に動くかを教えていただきたいです。また、初心者ゆえ、自分の記述した内容で間違いがあれば訂正していただけると助かります。
mac 10.14.1
使用している教科書 jupyter実践入門、ネット
参考にしたpython公式 https://docs.python.org/ja/3/howto/sorting.html
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/21 23:52