map() / filter() / sorted()
| 対応: | Python 2(2000) |
|---|
イテラブルの変換・フィルタリング・ソートを行う高階関数です。リスト内包表記と並んでデータ処理の中核を担います。
構文
# イテラブルの各要素に関数を適用した結果を返します。 map(関数, イテラブル, ...) # 関数が True を返す要素だけを返します。 filter(関数, イテラブル) # 新しいソート済みリストを返します(元のリストは変更されません)。 sorted(イテラブル, key=None, reverse=False) # イテラブルの最小値・最大値・合計を求めます。 min(イテラブル, key=None) max(イテラブル, key=None) sum(イテラブル, start=0)
関数一覧
| 関数 | 概要 |
|---|---|
| map(func, iterable) | 各要素に関数を適用したイテレータを返します。結果を使うには list() などで変換します。 |
| filter(func, iterable) | 関数が True を返す要素だけのイテレータを返します。func に None を指定すると Falsy な値を除外します。 |
| sorted(iterable, key, reverse) | イテラブルをソートした新しいリストを返します。key 関数でソートの基準を指定できます。 |
| min(iterable, key) | イテラブルの中の最小値を返します。key 関数でカスタム比較ができます。 |
| max(iterable, key) | イテラブルの中の最大値を返します。key 関数でカスタム比較ができます。 |
| sum(iterable, start=0) | イテラブルの数値の合計を返します。start で初期値を指定できます。 |
サンプルコード
sample_map_filter_sorted.py
# map() で各要素を変換します。
numbers = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x * 2, numbers))
print(doubled) # [2, 4, 6, 8, 10]
# 文字列のリストを整数に変換します。
str_nums = ["10", "20", "30"]
int_nums = list(map(int, str_nums))
print(int_nums) # [10, 20, 30]
# filter() で条件を満たす要素だけを抽出します。
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # [2, 4]
# None を指定すると Falsy な値を除外します。
data = [1, 0, "hello", "", None, [], [1, 2]]
clean = list(filter(None, data))
print(clean) # [1, 'hello', [1, 2]]
# sorted() で新しいソート済みリストを作成します。
fighters = ["ブルマ", "クリリン", "孫悟空", "ベジータ"]
sorted_fighters = sorted(fighters)
print(sorted_fighters) # 辞書順にソートされます。
# key 関数で文字列の長さでソートします。
sorted_by_len = sorted(fighters, key=len)
print(sorted_by_len) # 文字列の長さが短い順になります。
# 辞書のリストを特定のキーでソートします。
students = [
{"name": "孫悟空", "score": 92},
{"name": "ベジータ", "score": 85},
{"name": "クリリン", "score": 78},
]
by_score = sorted(students, key=lambda s: s["score"], reverse=True)
print(by_score[0]["name"]) # 孫悟空(最高点)
# min()・max()・sum() の使い方です。
scores = [85, 92, 78, 95, 70]
print(min(scores)) # 70
print(max(scores)) # 95
print(sum(scores)) # 420
print(sum(scores) / len(scores)) # 84.0(平均)
# key を指定して辞書のリストの最大値を取得します。
best = max(students, key=lambda s: s["score"])
print(best["name"]) # 孫悟空
python3 map_filter_sorted.py [2, 4, 6, 8, 10] [10, 20, 30] [2, 4] [1, 'hello', [1, 2]] ['クリリン', 'ブルマ', 'ベジータ', '孫悟空'] ['ブルマ', '孫悟空', 'クリリン', 'ベジータ'] 孫悟空 70 95 420 84.0 孫悟空
概要
『map()』と『filter()』は遅延評価のイテレータを返します。結果をリストとして使いたい場合は必ず『list()』で包んで変換してください。変換しないと『<map object at 0x...>』のようなオブジェクトが表示されます。
現代のPythonでは『map()』や『filter()』の代わりに『リスト内包表記』を使うほうがより読みやすいとされています。例えば『list(map(lambda x: x*2, nums))』は『[x*2 for x in nums]』と書くことができます。ただし、既存の関数(int や str など)を渡す場合は『map()』のほうが簡潔です。
『sorted()』はリストの『sort()』メソッドとは異なり、元のオブジェクトを変更せず新しいリストを返します。文字列・タプル・辞書のキーなど、リスト以外のイテラブルにも使えます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。