我们假设有一个列表a = [1, 3, 5, 6, 8]
。
我想在该列表上应用一些转换,我想避免按顺序执行,所以像map(someTransformationFunction, a)
这样的东西通常可以解决问题,但是如果转换需要知道每个对象的索引怎么办? ?
例如,假设每个元素必须乘以其位置。因此,列表应转换为a = [0, 3, 10, 18, 32]
。
有办法吗?
答案 0 :(得分:44)
使用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]
答案 1 :(得分:12)
您可以使用enumerate()
:
a = [1, 3, 5, 6, 8]
answer = map(lambda (idx, value): idx*value, enumerate(a))
print(answer)
<强>输出强>
[0, 3, 10, 18, 32]
答案 2 :(得分:7)
为了扩展Martijn Pieters的优秀答案,您还可以将list comprehensions与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
可能会获胜。
答案 3 :(得分:2)
与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)))))
答案 4 :(得分:0)
# 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))