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

Let*_*zee 30 python python-2.7 map-function

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

我想在该列表上应用一些转换,我想避免按顺序执行它,所以map(someTransformationFunction, a)通常可以做到这一点,但是如果转换需要了解每个对象的索引呢?

例如,假设每个元素必须乘以其位置.所以列表应该转换为a = [0, 3, 10, 18, 32].

有没有办法做到这一点?

Mar*_*ers 47

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

map(function, enumerate(a))
Run Code Online (Sandbox Code Playgroud)

你会被传递给一个元组,用(index, value).在Python 2中,您可以指定Python在函数签名中为您解包元组:

map(lambda (i, el): i * el, enumerate(a))
Run Code Online (Sandbox Code Playgroud)

注意(i, el)lambda参数规范中的元组.您可以在def声明中执行相同的操作:

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

map(mapfunction, enumerate(a))
Run Code Online (Sandbox Code Playgroud)

为了让其他函数签名功能(如注释)让位,函数参数中的元组解包已从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]
Run Code Online (Sandbox Code Playgroud)

  • @LetsPlayYahtzee:是的,在Python 3中,使用一个参数(这将是一个元组); `lambda i_el:i_el [0]*i_el [1]`; 在`def`语句中,您可以在单独的行中解压缩; `def mapfunction(i_el):`,*newline-and-indent-more*,`i,el = i_el`,*newline,match indent*,`return i*el`. (5认同)

gtl*_*ert 12

你可以使用enumerate():

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

answer = map(lambda (idx, value): idx*value, enumerate(a))
print(answer)
Run Code Online (Sandbox Code Playgroud)

产量

[0, 3, 10, 18, 32]
Run Code Online (Sandbox Code Playgroud)


mar*_*elm 7

为了扩展Martijn Pieters的优秀答案,您还可以结合使用列表推导enumerate:

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

要么

[mapfunction(i, v) for i, v in enumerate(a)]
Run Code Online (Sandbox Code Playgroud)

我觉得列表推导通常比map/ lambdaconstruct 更具可读性.当使用(i, v)直接接受元组的命名映射函数时,map可能会获胜.