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

时间:2018-08-16 02:10:06

标签: python functional-programming

让我们考虑一些列表:

arr = [2, 4, 6, 8, 10]

我需要将列表的每个元素除以其第一个元素。 可以通过列表理解来完成:

[e / arr[0] for e in arr]

但是我必须为此使用一些函数式编程

3 个答案:

答案 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结果。