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

c0vxltue  于 2023-02-11  发布在  Python
关注(0)|答案(6)|浏览(113)

我们假设有一个列表a = [1, 3, 5, 6, 8]
我想对这个列表应用一些转换,并且我想避免顺序地进行,所以像map(someTransformationFunction, a)这样的东西通常会起作用,但是如果转换需要知道每个对象的索引呢?
例如,假设每个元素都必须乘以它的位置,那么列表应该转换为a = [0, 3, 10, 18, 32]
有办法做到吗?

fhg3lkii

fhg3lkii1#

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

map(function, enumerate(a))

你的函数将被传递一个 * tuple *,带有(index, value),在Python 2中,你可以在函数签名中指定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]
laawzig2

laawzig22#

您可以使用enumerate()

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

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

产出

[0, 3, 10, 18, 32]
ckocjqey

ckocjqey3#

为了扩展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函数时,map可能会胜出。

yh2wf1be

yh2wf1be4#

使与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)))))
fslejnso

fslejnso5#

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

zqdjd7g96#

只是提醒一下,在python3中,enumerate不再是这样写的了
https://stackoverflow.com/a/15712231/1984636

相关问题