Pythonマップ関数の使用方法
序章
Pythonの組み込み関数map()
を使用して、イテレータ内の各アイテム(listやdictionaryなど)に関数を適用し、次の新しいイテレータを返すことができます。結果を取得します。 map()
は、プログラムの他の部分で使用できるマップオブジェクト(イテレーター)を返します。 マップオブジェクトをlist()
関数、または別のシーケンスタイプに渡して、反復可能オブジェクトを作成することもできます。
map()
関数の構文は次のとおりです。
map(function, iterable, [iterable 2, iterable 3, ...])
forループを使用する代わりに、map()
関数は、反復可能なすべてのアイテムに関数を適用する方法を提供します。 したがって、アイテムのコピーを別の反復可能にするのではなく、一度に1つのアイテムのみ機能を適用するため、パフォーマンスが向上することがよくあります。 これは、大きなデータセットを処理するプログラムで作業する場合に特に便利です。 map()
は、各イテラブルから一度に1つのアイテムを関数に送信することにより、関数への引数として複数のイテラブルを受け取ることもできます。
このチュートリアルでは、map()
を操作する3つの異なる方法を確認します。lambda
関数、ユーザー定義関数、最後に複数の反復可能な引数を使用する組み込み関数を使用します。 。
ラムダ関数の使用
map()
の最初の引数は関数であり、これを使用して各アイテムに適用します。 Pythonは、map()
に渡すiterable内のすべてのアイテムに対して1回関数を呼び出し、マップオブジェクト内の操作されたアイテムを返します。 最初の関数の引数には、ユーザー定義関数を渡すか、lambda
関数を使用できます。特に、式がそれほど複雑でない場合はそうです。
ラムダ関数を使用したmap()
の構文は次のとおりです。
map(lambda item: item[] expression, iterable)
次のようなリストを使用すると、リスト内の各アイテムに適用する式を使用してlambda
関数を実装できます。
numbers = [10, 15, 21, 33, 42, 55]
それぞれの数値に式を適用するには、map()
とlambda
を使用できます。
mapped_numbers = list(map(lambda x: x * 2 + 3, numbers))
ここでは、リスト内のアイテムをx
として宣言します。 次に、式を追加します。 map()
の反復可能として番号のリストを渡します。
この結果をすぐに受け取るために、map
オブジェクトのリストを印刷します。
print(mapped_numbers)
Output[23, 33, 45, 69, 87, 113]
list()
を使用して、<map object at 0x7fc250003a58>
のような人間が読めないオブジェクトではなく、マップオブジェクトがリストとして返されるようにしました。 マップオブジェクトは結果のイテレータであるため、for
でループするか、list()
を使用してリストに変換できます。 結果を確認するのに良い方法なので、ここでこれを行っています。
最終的に、map()
は大きなデータセットを操作するときに最も役立ちます。そのため、マップオブジェクトをさらに操作する可能性が高く、通常はlist()
のようなコンストラクターを使用しません。
小さいデータセットの場合、リスト内包表記の方が適している場合がありますが、このチュートリアルでは、小さいデータセットを使用してmap()
を示しています。
ユーザー定義関数の実装
lambda
と同様に、反復可能オブジェクトに適用するために定義した関数を使用できます。 lambda
関数は、1行の式を操作する場合に実装すると便利ですが、式が複雑になると、ユーザー定義関数の方が適切です。 さらに、反復可能に適用している関数に別のデータを渡す必要がある場合は、読みやすさのためにユーザー定義関数の方が適しています。
たとえば、次の反復可能では、各アイテムは、各水族館の生き物に関するさまざまな詳細を含む辞書です。
aquarium_creatures = [
{"name": "sammy", "species": "shark", "tank number": 11, "type": "fish"},
{"name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish"},
{"name": "jo", "species": "guppy", "tank number": 18, "type": "fish"},
{"name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish"},
{"name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish"},
{"name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"}
]
私たちは、すべての水族館の生き物が実際に同じ水槽に移動することを決定しました。 すべてのクリーチャーがタンク42
に移動していることを反映するために、レコードを更新する必要があります。 map()
が各ディクショナリと、ディクショナリ内の各キーと値のペアにアクセスできるようにするには、ネストされた関数を作成します。
def assign_to_tank(aquarium_creatures, new_tank_number):
def apply(x):
x["tank number"] = new_tank_number
return x
return map(apply, aquarium_creatures)
aquarium_creatures
とnew_tank_number
をパラメーターとして受け取るassign_to_tank()
関数を定義します。 assign_to_tank()
では、関数としてapply()
を最終行のmap()
に渡します。 assign_to_tank
関数は、map()
の結果のイテレーターを返します。
apply()
は、x
を引数として取ります。これは、リスト内の項目(単一の辞書)を表します。
次に、x
がaquarium_creatures
の"tank number"
キーであり、渡されたものをnew_tank_number
に格納する必要があることを定義します。 新しいタンク番号を適用した後、各アイテムを返品します。
辞書のリストと、クリーチャーごとに置き換える新しいタンク番号を使用して、assign_to_tank()
と呼びます。
assigned_tanks = assign_to_tank(aquarium_creatures, 42)
関数が完了すると、マップオブジェクトがassigned_tanks
変数に格納され、リストに変換されて次のように出力されます。
print(list(assigned_tanks))
このプログラムから次の出力を受け取ります。
Output[{'name': 'sammy', 'species': 'shark', 'tank number': 42, 'type': 'fish'}, {'name': 'ashley', 'species': 'crab', 'tank number': 42, 'type': 'shellfish'}, {'name': 'jo', 'species': 'guppy', 'tank number': 42, 'type': 'fish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': 42, 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': 42, 'type': 'fish'}, {'name': 'olly', 'species': 'green turtle', 'tank number': 42, 'type': 'turtle'}]
新しいタンク番号を辞書のリストにマッピングしました。 定義した関数を使用して、map()
を組み込んで、リストの各項目に関数を効率的に適用できます。
複数の反復可能関数での組み込み関数の使用
lambda
関数または独自に定義した関数と同じように、map()
でPython組み込み関数を使用できます。 複数の反復可能関数を持つ関数を適用するには、最初の反復可能名前の後に別の反復可能名前を渡します。 たとえば、 pow()関数を使用して、2つの数値を取り込んで、指定された指数に対する基数の累乗を求めます。
ここに、pow()
で使用したい整数のリストがあります。
base_numbers = [2, 4, 6, 8, 10]
powers = [1, 2, 3, 4, 5]
次に、関数としてpow()
をmap()
に渡し、2つのリストを反復可能として提供します。
numbers_powers = list(map(pow, base_numbers, powers))
print(numbers_powers)
map()
は、pow()
機能を各リストの同じアイテムに適用して、電力を供給します。 したがって、結果には2**1
、4**2
、6**3
などが表示されます。
Output[2, 16, 216, 4096, 100000]
map()
に他のイテラブルよりも長いイテラブルを提供した場合、map()
は、最短のイテラブルの終わりに達すると計算を停止します。 次のプログラムでは、base_numbers
を3つの追加番号で拡張しています。
base_numbers = [2, 4, 6, 8, 10, 12, 14, 16]
powers = [1, 2, 3, 4, 5]
numbers_powers = list(map(pow, base_numbers, powers))
print(numbers_powers)
その結果、このプログラムの計算では何も変更されないため、同じ結果が得られます。
Output[2, 16, 216, 4096, 100000]
map()
関数をPython組み込み関数とともに使用し、複数の反復可能関数を処理できることを確認しました。 また、map()
は、アイテムが最も少ない反復可能オブジェクトの最後に到達するまで、複数の反復可能オブジェクトを処理し続けることも確認しました。
結論
このチュートリアルでは、Pythonでmap()
関数を使用するさまざまな方法を学びました。 これで、map()
を独自の関数、lambda
関数、およびその他の組み込み関数で使用できます。 複数の反復可能関数を必要とする関数を使用してmap()
を実装することもできます。
このチュートリアルでは、map()
の結果を、デモンストレーション用にリスト形式ですぐに印刷しました。 私たちのプログラムでは、通常、返されたマップオブジェクトを使用して、データをさらに操作します。
Pythonの詳細については、 Python3シリーズのコーディング方法とPythonトピックページをご覧ください。 関数型プログラミングでのデータセットの操作の詳細については、filter()関数に関するの記事をご覧ください。