リスト_a = [1, 3, 5, 6, 8]
_があると仮定しましょう。
そのリストに何らかの変換を適用したいので、それを順番に行わないようにしたいので、map(someTransformationFunction, a)
のようなものは通常トリックを行いますが、各オブジェクトのインデックスの知識が変換に必要な場合はどうでしょうか?
たとえば、各要素にその位置を掛ける必要があるとしましょう。したがって、リストは_a = [0, 3, 10, 18, 32]
_に変換する必要があります。
それを行う方法はありますか?
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]
enumerate()
を使用できます:
a = [1, 3, 5, 6, 8]
answer = map(lambda (idx, value): idx*value, enumerate(a))
print(answer)
出力
[0, 3, 10, 18, 32]
Martijn Pietersの優れた答えを拡張するには、 list comprehensions をenumerate
と組み合わせて使用することもできます。
>>> 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
がおそらく勝ちます。
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)))))
# 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))