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