web-dev-qa-db-ja.com

マップ関数内でインデックス情報を使用できますか?

リスト_a = [1, 3, 5, 6, 8]_があると仮定しましょう。

そのリストに何らかの変換を適用したいので、それを順番に行わないようにしたいので、map(someTransformationFunction, a)のようなものは通常トリックを行いますが、各オブジェクトのインデックスの知識が変換に必要な場合はどうでしょうか?

たとえば、各要素にその位置を掛ける必要があるとしましょう。したがって、リストは_a = [0, 3, 10, 18, 32]_に変換する必要があります。

それを行う方法はありますか?

28
LetsPlayYahtzee

enumerate() 関数を使用してインデックスを追加します。

map(function, enumerate(a))

関数には、(index, value)とともにTupleが渡されます。 Python 2では、Python関数のシグネチャでTupleをアンパックするように指定できます。

map(lambda (i, el): i * el, enumerate(a))

ラムダ引数指定の(i, el)タプルに注意してください。 defステートメントでも同じことができます。

def mapfunction((i, el)):
    return i * el

map(mapfunction, enumerate(a))

注釈などの他の関数シグネチャ機能を使用するために、関数の引数でのタプルのアンパックがPython 3。

デモ:

>>> a = [1, 3, 5, 6, 8]
>>> def mapfunction((i, el)):
...     return i * el
...
>>> map(lambda (i, el): i * el, enumerate(a))
[0, 3, 10, 18, 32]
>>> map(mapfunction, enumerate(a))
[0, 3, 10, 18, 32]
45
Martijn Pieters

enumerate()を使用できます:

a = [1, 3, 5, 6, 8]

answer = map(lambda (idx, value): idx*value, enumerate(a))
print(answer)

出力

[0, 3, 10, 18, 32]
12
gtlambert

Martijn Pietersの優れた答えを拡張するには、 list comprehensionsenumerateと組み合わせて使用​​することもできます。

>>> a = [1, 3, 5, 6, 8]
>>> [i * v for i, v in enumerate(a)]
[0, 3, 10, 18, 32]

または

[mapfunction(i, v) for i, v in enumerate(a)]

リストの内包表記はmap/lambda構造よりも読みやすいことが多いと思います。 (i, v) Tupleを直接受け入れる名前付きマッピング関数を使用する場合、mapがおそらく勝ちます。

7
marcelm

Python3との互換性を持たせるには

def map_fn(data):
    idx, el = data
    return idx*el

my_list = [2,3,5,7]

print(list(map(map_fn, list(enumerate(my_list)))))
2
Dario Cazzani
# Python3
map(lambda args: print(args[0],args[1]) ,enumerate(a_list))
# use arg list, just get the result with index

# Python2
map(lambda index,content: print(index,content) ,enumerate(a_list))
0
Benchur Wong