如何按第一个元素划分列表中的每个元素



让我们考虑一些列表:

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多个参数starmaptruedivinoperator具有与运算符完全相同的功能/但只需使其以函数方式运行并接受两个参数并在它们之间返回div 结果。

最新更新