はじめに
Python における匿名関数は lambda 関数と呼ばれます。これらは名前なしで関数を作成する方法です。一度だけ使用される短い関数を作成するのに便利です。
Python における匿名関数は lambda 関数と呼ばれます。これらは名前なしで関数を作成する方法です。一度だけ使用される短い関数を作成するのに便利です。
リストは in-place でソートできます。sort メソッドを使用します。
s = [10,1,7,3]
s.sort() ## s = [1,3,7,10]
逆順でソートすることもできます。
s = [10,1,7,3]
s.sort(reverse=True) ## s = [10,7,3,1]
これは十分にシンプルに見えます。しかし、辞書のリストをどのようにソートするのでしょうか。
[{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'MSFT', 'price': 65.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100}]
どの基準でですか?
ソートをガイドするには、key 関数 を使用します。key 関数 は、辞書を受け取り、ソートに使用する対象の値を返す関数です。
portfolio = [
{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'MSFT', 'price': 65.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100}
]
def stock_name(s):
return s['name']
portfolio.sort(key=stock_name)
結果は次の通りです。
## `name` キーによる辞書のソート方法を確認する
[
{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'MSFT', 'price': 65.1,'shares': 50}
]
上記の例では、キー関数はコールバック関数の一例です。sort() メソッドは、あなたが提供する関数に「コールバック」します。コールバック関数は、その 1 つの操作にのみ使用される短い 1 行の関数が多いです。プログラマーは、この追加処理を指定するためのショートカットをよく求めます。
関数を作成する代わりに lambda を使用します。先ほどのソートの例では、
portfolio.sort(key=lambda s: s['name'])
これは、単一の 式を評価する 名前のない 関数を作成します。上記のコードは、最初のコードよりもはるかに短くなっています。
def stock_name(s):
return s['name']
portfolio.sort(key=stock_name)
## vs lambda
portfolio.sort(key=lambda s: s['name'])
if、while などの文はありません。sort() のような関数との組み合わせです。いくつかの株式ポートフォリオデータを読み取り、リストに変換します:
>>> import report
>>> portfolio = list(report.read_portfolio('portfolio.csv'))
>>> for s in portfolio:
print(s)
Stock('AA', 100, 32.2)
Stock('IBM', 50, 91.1)
Stock('CAT', 150, 83.44)
Stock('MSFT', 200, 51.23)
Stock('GE', 95, 40.37)
Stock('MSFT', 50, 65.1)
Stock('IBM', 100, 70.44)
>>>
株式名で辞書式にポートフォリオデータをソートする次の文を試してみましょう。
>>> def stock_name(s):
return s.name
>>> portfolio.sort(key=stock_name)
>>> for s in portfolio:
print(s)
... 結果を確認する...
>>>
この部分では、stock_name() 関数は portfolio リストの単一のエントリから株式の名前を抽出します。sort() はこの関数の結果を比較に使用します。
lambda 式を使って、保有株数に基づいてポートフォリオをソートしてみましょう:
>>> portfolio.sort(key=lambda s: s.shares)
>>> for s in portfolio:
print(s)
... 結果を確認する...
>>>
各株式の価格に基づいてポートフォリオをソートしてみましょう
>>> portfolio.sort(key=lambda s: s.price)
>>> for s in portfolio:
print(s)
... 結果を確認する...
>>>
注:lambda は便利なショートカットです。なぜなら、sort() の呼び出しで直接特殊な処理関数を定義できるからです。これは、まず別の関数を定義する必要があるのとは対照的です。
おめでとうございます!あなたは匿名関数と Lambda の実験を完了しました。あなたの技術を向上させるために、LabEx でさらに実験を行って練習することができます。