让我们考虑一些列表:
arr = [2, 4, 6, 8, 10]
我需要将列表的每个元素除以其第一个元素。 它可以通过列表理解来完成:
[e / arr[0] for e in arr]
但我必须为此使用一些函数式编程
map
:
>>> arr = [2, 4, 6, 8, 10]
>>> list(map(lambda x: x/arr[0],arr))
[1.0, 2.0, 3.0, 4.0, 5.0]
或作为函数:
>>> def f(x):
return x/arr[0]
>>> list(map(f,arr))
[1.0, 2.0, 3.0, 4.0, 5.0]
>>>
或使用 numpy:
>>> import numpy as np
>>> arr2=np.array(arr)
>>> arr2/arr[0]
array([ 1., 2., 3., 4., 5.])
>>>
如果你想要列表:
>>> import numpy as np
>>> arr2=np.array(arr)
>>> (arr2/arr[0]).tolist()
[1.0, 2.0, 3.0, 4.0, 5.0]
>>>
您可以将内置函数map
与类list
结合使用:
arr = [2, 4, 6, 8, 10]
new_arr = list(map(lambda x: x / arr[0], arr))
map()
返回一个迭代器,该迭代器将函数应用于可迭代对象的每个项,从而生成结果。
list()
需要一个可迭代对象来生成列表。
使用map
:
arr = [2, 4, 6, 8, 10]
out = list(map(lambda x: x/arr[0], arr))
如果你不喜欢lambda
表达式,你可以在operator
中使用truediv
(或floordiv
(方法,但需要两个参数,所以在这里我用了一个小技巧。
from operator import truediv
from itertools import starmap
arr = [2, 4, 6, 8, 10]
arr = zip(arr, [arr[0]]*len(arr))
out = list(starmap(truediv, arr))
print(out)
我首先根据问题构建一个新的可迭代对象,然后使用可以为函数map
多个参数的starmap
。truediv
inoperator
具有与运算符完全相同的功能/
但只需使其以函数方式运行并接受两个参数并在它们之间返回div 结果。