我可以在地图函数中使用索引信息吗?

Can I use index information inside the map function?

假设有一个列表 a = [1, 3, 5, 6, 8]

我想对该列表应用一些转换并且我想避免按顺序进行,所以像 map(someTransformationFunction, a) 这样的东西通常可以解决问题,但是如果转换需要了解索引的知识怎么办每个对象?

例如,假设每个元素都必须乘以它的位置。所以列表应该转换为 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]

使用enumerate()函数添加索引:

map(function, enumerate(a))

您的函数将被传递一个 元组 ,其中 (index, value)。在Python2中,你可以在函数签名中指定Python为你解压元组:

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

注意 lambda 参数规范中的 (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]

要扩展 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) 元组的命名映射函数时,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))