Подтвердить что ты не робот

Могу ли я использовать индексную информацию внутри функции карты?

Предположим, что существует список a = [1, 3, 5, 6, 8].

Я хочу применить какое-то преобразование в этом списке, и я хочу избежать его последовательно, поэтому что-то вроде map(someTransformationFunction, a) обычно выполняет трюк, но что, если преобразование должно знать информацию об индексе каждого объекта?

Например, скажем, что каждый элемент должен быть умножен на его позицию. Поэтому список должен быть преобразован в a = [0, 3, 10, 18, 32].

Есть ли способ сделать это?

4b9b3361

Ответ 1

Используйте функцию enumerate() для добавления индексов:

map(function, enumerate(a))

Ваша функция будет передана кортежем с помощью (index, value). В Python 2 вы можете указать, что Python распакует кортеж для вас в сигнатуре функции:

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]

Ответ 2

Вы можете использовать enumerate():

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

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

Выход

[0, 3, 10, 18, 32]

Ответ 3

Чтобы расширить превосходный ответ Martijn Pieters, вы также можете использовать списочные выражения в сочетании с 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) напрямую, map вероятно, выигрывает.

Ответ 4

Сделать совместимым с 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)))))

Ответ 5

# 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))