330
map(function, iterable, ...)

関数を iterable のすべてのアイテムに適用し、結果のリストを返します。追加の iterable 引数が渡された場合、関数はその数の引数を受け取る必要があり、すべての iterable の項目に並列に適用されます。

1 つの iterable が別の iterable よりも短い場合、None アイテムで拡張されていると見なされます。

function が の場合None、恒等関数が想定されます。複数の引数がある場合はmap()、すべての iterable から対応する項目を含むタプルで構成されるリストを返します (一種の転置操作)。

反復可能な引数は、シーケンスまたは任意の反復可能なオブジェクトです。結果は常にリストです。

これは、デカルト積を作成する際にどのような役割を果たしますか?

content = map(tuple, array)

タプルをそこに置くと、どのような効果がありますか? abcまた、 map 関数を使用しないと、出力がであることに気付きましたa, b, c

この機能を完全に理解したい。参照定義もわかりにくいです。派手すぎるフワフワ。

4

6 に答える 6

475

map特にpythonicではありません。代わりにリスト内包表記を使用することをお勧めします。

map(f, iterable)

基本的には次と同等です:

[f(x) for x in iterable]

map出力リストの長さは常に入力リストと同じであるため、単独ではデカルト積を計算できません。ただし、リスト内包表記を使用してデカルト積を簡単に実行できます。

[(a, b) for a in iterable_a for b in iterable_b]

構文は少しややこしいですが、基本的には以下と同じです:

result = []
for a in iterable_a:
    for b in iterable_b:
        result.append((a, b))
于 2012-06-11T01:51:42.233 に答える
93

mapデカルト積とはまったく関係ありませんが、関数型プログラミングに精通している人なら、 を使用して生成する理解不可能な方法を考え出すことができると思いますmap

mapPython 3 では、これと同等です。

def map(func, iterable):
    for i in iterable:
        yield func(i)

Python 2 での唯一の違いは、ing ではなく、結果の完全なリストを作成してすべてを一度に返すyieldことです。

Python の慣例では通常、 への呼び出しと同じ結果を得るためにリスト内包表記 (またはジェネレーター式) が優先されますがmap、特に最初の引数としてラムダ式を使用している場合は、次のようになります。

[func(i) for i in iterable]

「文字列を配列に変換する」という質問のコメントで求めたものの例として、「配列」によって、おそらくタプルまたはリストのいずれかが必要になります (どちらも他の言語の配列のように動作します)。 -

 >>> a = "hello, world"
 >>> list(a)
['h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']
>>> tuple(a)
('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd')

ここでの使用は、単一の文字列ではなく文字列のリストmapで開始する場合です-それらすべてを個別にリストできます:map

>>> a = ["foo", "bar", "baz"]
>>> list(map(list, a))
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

map(list, a)これは Python 2 でも同等ですが、Python 3 では、ループ (またはシーケンスではなくイテラブルのみを必要とするような処理関数)listにフィードする以外のことをしたい場合に呼び出しが必要になることに注意してください。しかし、通常はリスト内包表記が好まれることにも注意してください。forsum

>>> [list(b) for b in a]
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]
于 2012-06-11T01:49:50.023 に答える
39

mapソースのすべての要素に関数を適用して新しいリストを作成します。

xs = [1, 2, 3]

# all of those are equivalent — the output is [2, 4, 6]
# 1. map
ys = map(lambda x: x * 2, xs)
# 2. list comprehension
ys = [x * 2 for x in xs]
# 3. explicit loop
ys = []
for x in xs:
    ys.append(x * 2)

n-arymapは、入力イテラブルをまとめて圧縮し、その中間圧縮リストのすべての要素に変換関数を適用することと同じです。これはデカルト積ではありません。

xs = [1, 2, 3]
ys = [2, 4, 6]

def f(x, y):
    return (x * 2, y // 2)

# output: [(2, 1), (4, 2), (6, 3)]
# 1. map
zs = map(f, xs, ys)
# 2. list comp
zs = [f(x, y) for x, y in zip(xs, ys)]
# 3. explicit loop
zs = []
for x, y in zip(xs, ys):
    zs.append(f(x, y))

私はzipここで使用しましたがmap、イテラブルが同じサイズでない場合、実際の動作はわずかに異なります — ドキュメントに記載されているように、イテラブルを含むように拡張しますNone

于 2012-06-11T01:50:01.923 に答える
20

少し単純化すると、次のmap()ようなことを想像できます。

def mymap(func, lst):
    result = []
    for e in lst:
        result.append(func(e))
    return result

ご覧のとおり、関数とリストを受け取り、入力リストの各要素に関数を適用した結果を含む新しいリストを返します。実際には複数のイテラブルmap()を処理できるため、「少し単純化する」と言いました。

追加の iterable 引数が渡された場合、関数はその数の引数を受け取る必要があり、すべての iterable からの項目に並列に適用されます。1 つの iterable が別の iterable よりも短い場合、None アイテムで拡張されていると見なされます。

質問の 2 番目の部分: これはデカルト積を作成する際にどのような役割を果たしますか? まあ、次のようなリストのデカルト積を生成するために使用map() できます。

lst = [1, 2, 3, 4, 5]

from operator import add
reduce(add, map(lambda i: map(lambda j: (i, j), lst), lst))

...しかし、実を言うと、使用product()は問題を解決するためのはるかに簡単で自然な方法です。

from itertools import product
list(product(lst, lst))

lstいずれにせよ、結果は上で定義した のデカルト積です。

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
 (2, 1), (2, 2), (2, 3), (2, 4), (2, 5),
 (3, 1), (3, 2), (3, 3), (3, 4), (3, 5),
 (4, 1), (4, 2), (4, 3), (4, 4), (4, 5),
 (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
于 2012-06-11T01:55:14.953 に答える
11

Python3 - マップ (関数、反復可能)

完全に言及されていないことの1つは(@BlooBがちょっと言及しましたが)、マップはリストではなくマップオブジェクトを返すことです。これは、初期化と反復の時間パフォーマンスに関しては大きな違いです。これら 2 つのテストを検討してください。

import time
def test1(iterable):
    a = time.clock()
    map(str, iterable)
    a = time.clock() - a

    b = time.clock()
    [ str(x) for x in iterable ]
    b = time.clock() - b

    print(a,b)


def test2(iterable):
    a = time.clock()
    [ x for x in map(str, iterable)]
    a = time.clock() - a

    b = time.clock()
    [ str(x) for x in iterable ]
    b = time.clock() - b

    print(a,b)


test1(range(2000000))  # Prints ~1.7e-5s   ~8s
test2(range(2000000))  # Prints ~9s        ~8s

ご覧のとおり、map 関数の初期化にはほとんど時間がかかりません。ただし、マップ オブジェクトを反復処理すると、単純に iterable を反復処理するよりも時間がかかります。これは、 map() に渡された関数が、繰り返しで要素に到達するまで各要素に適用されないことを意味します。リストが必要な場合は、リスト内包表記を使用します。for ループで反復する予定があり、ある時点で中断する場合は、map を使用します。

于 2018-10-16T22:08:23.870 に答える