データ処理のための Python Map 関数の究極ガイド
導入
Python 組み込み関数 map()
を使用して、反復可能 (リストや辞書など) 内の各項目に関数を適用し、結果を取得するための新しい反復子を返すことができます。 map()
はマップ オブジェクト (イテレータ) を返します。これはプログラムの他の部分で使用できます。また、マップ オブジェクトを list()
関数または別のシーケンス型に渡して反復可能オブジェクトを作成することもできます。
map()
関数の構文は次のとおりです。
map(function, iterable, [iterable 2, iterable 3, ...])
for
ループを使用する代わりに、map()
関数は、反復可能内のすべての項目に関数を適用する方法を提供します。したがって、項目のコピーを別の反復可能オブジェクトに作成するのではなく、一度に 1 項目ずつ関数を適用するだけなので、パフォーマンスが向上することがよくあります。これは、大規模なデータ セットを処理するプログラムで作業する場合に特に便利です。 map()
は、各反復可能オブジェクトから一度に 1 つの項目を関数に送信することで、複数の反復可能オブジェクトを関数の引数として受け取ることもできます。
このチュートリアルでは、map()
を操作する 3 つの異なる方法を確認します。lambda
関数を使用する方法、ユーザー定義関数を使用する方法、最後に組み込み関数を使用する方法です。関数内で複数の反復可能な引数を使用します。
Lambda 関数の使用
map()
の最初の引数は関数であり、各項目に適用するために使用します。 Python は、 map()
に渡す反復可能オブジェクト内のすべての項目に対してこの関数を 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)
[23, 33, 45, 69, 87, 113]
list()
を使用して、マップ オブジェクトが <0x7fc250003a58 のマップ オブジェクト>
のような可読性の低いオブジェクトではなく、リストとして返されるようにしました。マップ オブジェクトは結果の反復子であるため、for
を使用してループしたり、list()
を使用して結果をリストに変換したりできます。ここでこれを行うのは、結果を確認するのに良い方法だからです。
結局のところ、map()
は大規模なデータセットを操作する場合に最も役立ちます。そのため、マップ オブジェクトをさらに操作することになり、通常は list()
のようなコンストラクターを使用しません。彼らの上で。
小さいデータセットの場合は、リスト内包表記の方が適している可能性がありますが、このチュートリアルの目的では、map()
を示すために小さいデータセットを使用します。
ユーザー定義関数の実装
lambda
と同様に、定義した関数を使用して反復可能に適用できます。 1 行の式を扱う場合は lambda
関数を実装すると便利ですが、式が複雑になる場合はユーザー定義関数の方が適しています。さらに、反復可能に適用している関数に別のデータを渡す必要がある場合は、読みやすさを考慮してユーザー定義関数を選択する方が良い場合があります。
たとえば、次の反復可能オブジェクトでは、各項目は水族館の生き物それぞれについてのさまざまな詳細を含む辞書です。
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))
このプログラムから次の出力を受け取ります。
[{'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
関数や独自に定義した関数と同じように、Python 組み込み関数を map()
で使用できます。複数の反復可能な関数を適用するには、最初の反復可能な名前の後に別の反復可能な名前を渡します。たとえば、2 つの数値を受け取る pow()
関数を使用して、指定された指数に対する基数の累乗を求めます。
ここに、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
などが表示されます。
[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)
結果として、このプログラムの計算内では何も変更されず、同じ結果が得られます。
[2, 16, 216, 4096, 100000]
map()
関数を Python 組み込み関数とともに使用し、複数の反復可能関数を処理できることを確認しました。また、map()
は、アイテムが最も少ない反復可能オブジェクトの最後に到達するまで、複数の反復可能オブジェクトの処理を継続することも確認しました。
結論
このチュートリアルでは、Python の map()
関数を利用するさまざまな方法を検討してきました。 map()
をカスタム関数、lambda
式、その他の組み込み関数で使用できるようになりました。さらに、map()
は複数の反復可能オブジェクトを必要とする関数に適用できるため、データ処理タスクにおける汎用性が高まります。
デモンストレーションの目的で、map()
の結果をリストに直接変換しました。実際のアプリケーションでは、返されたマップ オブジェクトは、特定のニーズに合わせてさらに操作できます。
Python についての理解を深めるには、次のリソースをご利用ください。
- より詳細な例と使用例については、Python
map()
関数のチュートリアルを参照してください。 - Python の辞書を理解して、Python データ構造の知識を深めます。
- さまざまな文字列操作テクニックを探索するための Python 文字列関数。
これらのリソースは、Python の機能とそれをプロジェクトで効果的に活用する方法を包括的に理解するのに役立ちます。
Python についてさらに詳しく知りたい場合は、「Python でコーディングする方法」シリーズと Python トピック ページをご覧ください。関数型プログラミングでのデータ セットの操作の詳細については、filter()
関数に関する記事を参照してください。
よくある質問
Pythonのmap()は何をするのでしょうか?
Python の map()
関数は、関数と 1 つ以上の反復可能オブジェクトを受け取り、指定された関数を指定された反復可能オブジェクトの各要素に適用する反復子を返します。言い換えれば、反復可能な各項目にわたって関数を「マッピング」します。例えば:
numbers = [1, 2, 3, 4]
squares = map(lambda x: x**2, numbers)
ここで、squares
は 1、4、9、16 の反復子になります。
Python でマップを作成するにはどうすればよいですか?
マップ オブジェクトを作成するには、関数と少なくとも 1 つの反復可能オブジェクトを引数として組み込みの map()
関数を呼び出します。例えば:
def add_one(x):
return x + 1
my_list = [1, 2, 3]
mapped = map(add_one, my_list) # Creates a map object
その後、マッピングされたものを反復処理するか、リストに変換して結果を確認できます。
print(list(mapped)) # [2, 3, 4]
Python のマップは怠惰ですか?
はい、Python 3 では、map()
は遅延反復子を返します。これは、すべての結果を一度に処理したりメモリに保存したりしないことを意味します。代わりに、反復処理の際にオンデマンドで各結果を計算します。これにより、特に大規模なデータセットの場合、メモリ効率が向上しますが、再構築せずに同じマップ オブジェクトに対して直接インデックスを作成したり繰り返し反復したりすることはできないことも意味します。
map()
関数はどのように機能しますか?
map()
関数は次のように動作します。
- 関数と 1 つ以上の反復可能オブジェクトを指定します。
map()
は、各反復可能オブジェクトから要素を取得します。- これらの要素を引数として関数を呼び出します。
- その関数呼び出しの結果が得られます。
- いずれかの反復可能オブジェクトがなくなるまで、このプロセスが繰り返されます。
複数の反復可能オブジェクトが指定された場合、map()
は最も短い反復可能オブジェクトが使い果たされたときに停止します。例えば:
numbers = [1, 2, 3]
others = [10, 20, 30]
result = map(lambda x, y: x + y, numbers, others)
print(list(result)) # [11, 22, 33]
Python で map
を使用する必要がありますか?
map()
を使用するかどうかは、個人の好みと読みやすさによって決まります。
長所:
- 場合によっては、より簡潔になる場合もあります。
- 特定のシナリオでは、リスト内包表記よりわずかに高速になる可能性があります (ただし、大幅ではない場合がほとんどです)。
短所:
- リスト内包表記やジェネレーター式を使用したコードは、多くの場合、より「Python らしく」、より読みやすいと考えられます。
- 初心者の Python プログラマは、リスト内包表記の方が直感的であると感じるかもしれません。
つまり、コードをより明確かつ直接的にするには、 map()
を使用してください。それ以外の場合は、リスト内包表記またはジェネレーター式が非常に一般的な代替手段となります。
Python で map
を文字列に変換するにはどうすればよいですか?
map
オブジェクトは文字列ではなくイテレータです。 map()
呼び出しの結果を文字列に変換する場合は、まずそれを反復処理する必要があります。一般的なアプローチには次のようなものがあります。
- リストに変換してから文字列表現に変換します。
mapped = map(str, [1, 2, 3])
string_representation = str(list(mapped)) # "[‘1’, ‘2’, ‘3’]"
- 結果が文字列要素である場合は、結果を結合します。
mapped = map(str, [1, 2, 3])
joined_string = ''.join(mapped) # "123"
最適な方法は、人間が判読できるリスト表現 (str(list(...))
) が必要か、結果の連結 (''.join(...) が必要かによって異なります。 )
)。
map count()
は何をしますか?
Python の map
オブジェクトには、組み込みの count()
メソッドがありません。 count()
メソッドは、リスト、文字列、およびその他の特定のコレクションで使用できます。マップ オブジェクトによって生成された値の出現回数をカウントしたい場合は、まずそれをリストに変換する必要があります (これによりイテレータが消費されます)。
mapped = map(lambda x: x*2, [1, 2, 3, 2])
mapped_list = list(mapped)
count_of_4 = mapped_list.count(4) # 2, because 2*2=4 appears twice
リストに変換せずにカウントが必要な場合は、手動で繰り返すことができます。
count_of_value = sum(1 for x in map(lambda x: x*2, [1, 2, 3, 2]) if x == 4)
Python の map
と filter
は何をしますか?
map(function, iterable)
: iterable の各要素に function を適用し、結果のイテレータを返します。filter(function, iterable)
: function(element) が True である iterable からの要素のイテレータを返します。 function が None の場合、それ自体が真実である要素を返します。
例えば:
nums = [1, 2, 3, 4, 5]
mapped_nums = map(lambda x: x*2, nums) # [2, 4, 6, 8, 10]
filtered_nums = filter(lambda x: x > 2, nums) # [3, 4, 5]
map
は各要素を変換し、filter
は条件に基づいて特定の要素を選択します。