ウェブサイト検索

データ処理のためのPython Map関数の究極ガイド


紹介

Pythonの組み込み関数map()を使用して、リストや辞書のようなイテラブルの各アイテムに関数を適用し、結果を取得するための新しいイテレータを返すことができます。map()はマップオブジェクト(イテレータ)を返し、私たちのプログラムの他の部分で使用できます。また、マップオブジェクトをlist()関数や別のシーケンスタイプに渡して、イテラブルを作成することもできます。

map()関数の構文は次のとおりです:

map(function, iterable, [iterable 2, iterable 3, ...])

forループを使用する代わりに、map()関数は反復可能なすべての項目に関数を適用する方法を提供します。したがって、項目を別の反復可能なものにコピーするのではなく、一度に1つの項目に関数を適用するだけなので、しばしばよりパフォーマンスが向上します。これは、大規模なデータセットを処理するプログラムに特に便利です。map()は、各反復可能なものから1つの項目を関数に送信して、関数に複数の反復可能なものを引数として取ることもできます。

このチュートリアルでは、map()を使用する3つの異なる方法について説明します:lambda関数を使う方法、ユーザー定義関数を使う方法、そして複数のイテラブル引数を使った組み込み関数を使う方法です。

ラムダ関数を使用する

map()への最初の引数は関数であり、これは各アイテムに適用するために使用します。Pythonは、map()に渡したイテラブルの各アイテムについて一度関数を呼び出し、操作されたアイテムをマップオブジェクト内で返します。最初の関数引数には、ユーザー定義の関数を渡すこともできますし、特に式がそれほど複雑でない場合は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() を使用して、マップオブジェクトが <map object at 0x7fc250003a58> のような人間にとって読み取りにくいオブジェクトではなく、リストとして返されるようにしました。マップオブジェクトは結果に対するイテレーターであるため、for を使ってループすることもできますし、list() を使ってリストに変換することもできます。ここでこれを行っているのは、結果を確認する良い方法だからです。

最終的には、map()は大規模なデータセットを扱うときに最も便利であり、私たちは地図オブジェクトをさらに使うことが多く、一般的にはそれらに対してlist()のようなコンストラクタは使わないでしょう。

小さなデータセットに対してはリスト内包表記がより適しているかもしれませんが、このチュートリアルの目的のために、map()を示すために小さなデータセットを使用しています。

ユーザー定義関数の実装

言うまでもなく、lambdaのように、定義した関数を反復可能なオブジェクトに適用することができます。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)

assign_to_tank() 関数を定義します。この関数は aquarium_creatures と new_tank_number をパラメータとして受け取ります。assign_to_tank() では、最終行で map() の関数として apply() を渡します。assign_to_tank 関数は map() の結果として生成されるイテレータを返します。

apply()は引数としてxを取ります。これは私たちのリストにあるアイテム、つまり単一の辞書を表します。

次に、x を aquarium_creatures からの "タンク番号" キーとして定義し、それが渡された 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 関数や自分で定義した関数と同様に、map() を使って Python の組み込み関数を使用できます。複数の反復可能なオブジェクトに関数を適用するには、最初のものに続いて別の反復可能なオブジェクトの名前を渡します。例えば、二つの数を入力として基数の指定された指数へのべき乗を求める pow() 関数を使います。

ここに、pow()と一緒に使いたい整数のリストがあります:

base_numbers = [2, 4, 6, 8, 10]
powers = [1, 2, 3, 4, 5]

次に、map() に関数として pow() を渡し、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]

私たちは、Pythonの組み込み関数とともにmap()関数を使用し、複数の反復可能オブジェクトを扱うことができることを確認しました。また、map()は、最も少ないアイテムを持つ反復可能オブジェクトの終わりに達するまで、複数の反復可能オブジェクトを処理し続けることもレビューしました。

結論

このチュートリアルでは、Pythonにおけるmap()関数のさまざまな利用方法を探りました。これで、map()をカスタム関数、lambda式、および他の組み込み関数と一緒に使用する能力を身につけました。さらに、map()は複数のイテラブルを必要とする関数にも適用でき、データ処理タスクにおける汎用性が向上します。

デモンストレーションの目的で、map() の結果を直接リストに変換しました。実用的なアプリケーションでは、返されたマップオブジェクトを特定のニーズに合わせてさらに操作することができます。

Pythonの理解を深めるために、以下のリソースを使用してください:

  • Pythonのmap()関数のチュートリアルは、より詳細な例や使用事例のためのものです。
  • Pythonの辞書を理解して、Pythonのデータ構造に関する知識を深める。
  • さまざまな文字列操作技術を探索するためのPythonの文字列関数。

これらのリソースは、Pythonの機能を包括的に理解し、それをプロジェクトで効果的に活用する方法を提供します。

Pythonについてもっと学びたいなら、私たちの「How To Code in 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でマップを作成するにはどうすればよいですか?

組み込みのmap()関数を呼び出し、関数と少なくとも1つのイテラブルを引数として渡すことで、マップオブジェクトを作成します。例えば:

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のmapは怠惰ですか?

はい、Python 3では、map()は遅延イテレータを返します。つまり、一度にすべての結果をメモリに処理したり保存したりしません。その代わりに、イテレートしている間に要求に応じて各結果を計算します。これは特に大規模なデータセットに対してメモリをより効率的に使用できる可能性がありますが、同じマップオブジェクトを直接インデックス付けしたり、再度イテレートしたりすることは再構築なしではできないことを意味します。

map()関数はどのように機能しますか?

map()関数は次のように動作します:

  1. 関数と1つ以上の反復可能なオブジェクトを提供します。
  2. map() は各反復可能オブジェクトから要素を取得します。
  3. これらの要素を引数として関数を呼び出します。
  4. その関数呼び出しの結果を返します。
  5. このプロセスは、イテラブルのいずれかが尽きるまで繰り返されます。

複数の反復可能オブジェクトが与えられた場合、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()を使用するかどうかは、個人の好みと可読性に依存します:

利点:

  • 場合によっては、より簡潔にできることがあります。
  • 特定のシナリオではリスト内包表記よりもわずかに速くなることがあります(ただし、通常はそれほどではありません)。

欠点:

  • リスト内包表記やジェネレーター式を使ったコードは、しばしばより「Pythonic」と見なされ、より読みやすいとされています。
  • 新しい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() は何をしますか?

mapオブジェクトにはPythonに組み込みのcount()メソッドがありません。count()メソッドはリスト、文字列、および特定の他のコレクションで利用可能です。mapオブジェクトによって生成された値の出現回数を数えたい場合、まずそれをリストに変換する必要があります(これによりイテレータが消費されます):

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): iterableからfunction(element)がTrueである要素のイテレータを返します。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は条件に基づいて特定の要素を選択します。

関連記事: