繁体   English   中英

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

[英]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()函数添加索引:

map(function, enumerate(a))

您的函数将传递一个元组 ,其中包含(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]

你可以使用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的优秀答案,您还可以将列表推导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可能会获胜。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM