Python 集合的归约与折叠

  • Post category:Python

Python 集合的归约与折叠是指将集合中所有元素通过某种指定的操作(比如加法、乘法等)进行累计计算的过程。这个过程得到的结果可能是一个单一的值(归约),也可能是一个新的集合(折叠)。

具体的实现可借助 Python 内置函数 reduce 和 functools 模块中的 reduce 和 partial 函数。下面是 Python 集合的归约与折叠的完整攻略:

集合的归约

reduce函数

reduce 函数定义如下:

reduce(function, iterable[, initializer])

其中,function 是一个接受两个参数的函数,它会对 iterable 中的所有元素进行累计计算。如果指定了 initializer 参数,则会将其作为第一个元素传递给函数。

例如,我们可以用 reduce 函数求一个列表的和,示例代码如下:

from functools import reduce

lst = [1, 2, 3, 4, 5]
# 同等写法
# total = reduce(lambda x, y: x + y, lst)
total = reduce((lambda x, y: x + y), lst)
print(total) #输出 15

自定义函数

除了使用内置的函数外,我们还可以通过自定义函数来实现归约。例如,下面的代码通过定义一个 lambda 函数来实现对列表中所有元素的乘积:

from functools import reduce

lst = [1, 2, 3, 4, 5]
# 同等写法
# product = reduce(lambda x, y: x * y, lst)
def multiply(x, y):
    return x * y

product = reduce(multiply, lst)
print(product) #输出 120

集合的折叠

reduce 函数

折叠操作的实现也可以借助 reduce 函数完成。下面的代码演示了如何通过 reduce 函数将一个列表中所有大于 3 的元素加倍:

from functools import reduce

lst = [1, 2, 3, 4, 5]
result = reduce(lambda res, x: res + [x * 2] if x > 3 else res, lst, [])
print(result) #输出 [8, 10]

在这个例子中,我们通过 reduce 函数的第三个参数指定了初始值空列表 []。

functools.partial 函数

另一种实现折叠的方法是通过 functools.partial 函数实现。下面的代码演示了这种方法的使用,它通过定义一个 partial 函数来将一个列表中的所有元素都乘 2:

from functools import partial

lst = [1, 2, 3, 4, 5]
multiply_2 = partial(map, (lambda x: x * 2))
result = list(multiply_2(lst))
print(result) #输出 [2, 4, 6, 8, 10]

在这个例子中,我们通过 partial 函数实现了一个新的函数 multiply_2,它将列表中的每个元素都乘 2。然后,我们将这个新函数作为参数传给了 map 函数,从而得到了一个新的列表。