让我们考虑一些列表:
arr = [2, 4, 6, 8, 10]
我需要将列表的每个元素除以其第一个元素。 可以通过列表理解来完成:
[e / arr[0] for e in arr]
但是我必须为此使用一些函数式编程
答案 0 :(得分:4)
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]
>>>
答案 1 :(得分:2)
您可以将内置函数map
与类list
结合使用:
arr = [2, 4, 6, 8, 10]
new_arr = list(map(lambda x: x / arr[0], arr))
map()
返回一个迭代器,该迭代器将函数应用于每个可迭代项,并产生结果。
list()
进行迭代以生成列表。
答案 2 :(得分:2)
使用map
:
arr = [2, 4, 6, 8, 10]
out = list(map(lambda x: x/arr[0], arr))
如果您不喜欢lambda
表达式,则可以在truediv
中使用floordiv
(或operator
)方法,但是需要两个参数,因此这里我用了一个小把戏。
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)
我首先根据问题构建一个新的Iterable,然后使用starmap
可以{strong>多个参数来实现一个功能。 map
中的truediv
具有与运算符operator
完全相同的功能,但只是使其以函数方式运行并接受两个参数并返回它们之间的div结果。