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

Python 我可以在map函数中使用索引信息吗?,python,python-2.7,map-function,Python,Python 2.7,Map Function,假设有一个列表a=[1,3,5,6,8] 我想对该列表应用一些转换,并且我想避免按顺序进行转换,所以像map(someTransformationFunction,a)这样的东西通常会起作用,但是如果转换需要了解每个对象的索引,该怎么办 例如,假设每个元素必须乘以其位置。因此,应该将列表转换为a=[0,3,10,18,32] 有办法吗?您可以使用enumerate(): 输出 [0, 3, 10, 18, 32] 使用该函数添加索引: map(function, enumerate(a))

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

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

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


有办法吗?

您可以使用
enumerate()

输出

[0, 3, 10, 18, 32]
使用该函数添加索引:

map(function, enumerate(a))
您的函数将被传递一个元组,其中包含
(索引,值)
。在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))
为了给其他函数签名特性(如注释)让路,Python3中删除了函数参数中的元组解包

演示:


为了扩展Martijn Pieters的优秀答案,您还可以结合使用
枚举

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

answer = map(lambda (idx, value): idx*value, enumerate(a))
print(answer)
>>> a = [1, 3, 5, 6, 8]
>>> [i * v for i, v in enumerate(a)]
[0, 3, 10, 18, 32]


我觉得列表理解通常比
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)))))
#蟒蛇3
映射(lambda args:print(args[0],args[1]),枚举(a_列表))
#使用arg list,只需使用索引获取结果
#蟒蛇2
映射(lambda索引,内容:打印(索引,内容),枚举(a_列表))

+1用于突出显示函数定义中元组赋值的技巧。我以前从未见过这个例子。所以这个例子只适用于python2?@LetsPlayYahtzee:是的,在python3中,使用一个参数(将是一个元组)<代码>lambda i_el:i_el[0]*i_el[1];在
def
语句中,您可以在单独的一行中解包<代码>定义映射函数(i_el):,换行和缩进更多,
i,el=i_el
,换行,匹配缩进,
返回i*el
。您是对的,在后一种情况下,
map
符号更有意义。在我的例子中,使用带有map的命名函数是正确的选择,因为实际上该函数需要做的不仅仅是乘以索引。
[mapfunction(i, v) for i, v in enumerate(a)]
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)))))