我正在尝试找到Python中可用的函数方法,可用于检查列表中的所有元素是否相等。本能地,我觉得这应该是可能的。
我的目标是构建一个功能解决方案来解决检查列表中所有值是否相等的问题。
如果您在此网站上搜索类似的问题,您会找到为 Python 编写的问题和答案,但这些问题和答案都不采用函数式方法。
** 超出这一点的所有内容都只是我思考过程中的笔记。可能没有什么用,我打算稍后删除它。 **
我怀疑需要的是某种运算符,它接受一种类型的参数对,加上第二种类型的参数并返回一个新类型。换句话说,一个运算符接受三个参数并返回不同类型的参数。
这可能有点难以解释或可视化,所以我将尝试演示算法中的步骤:
f(accum, left, right) -> result # result = (next_accum)
# apply f to
input = [1, 1, 1, 1, 1, 1, ...]
输入为:
T
类型的参数)R
输出应该是:
R
这个“东西”将一些函数应用于元素对
left, right
,然后将==
逻辑应用于所有结果。
更具体地说,问题是这样的:
对于列表
l = [a, b, c, d, e, f, ...]
获取相邻元素对,应用函数来转换这些元素并返回结果 r
,继续应用此函数,并为该函数的每个后续应用获取累加器值 r
。
作为算法:
(None, (a, b)) -> r0
(r0, (b, c)) -> r1
(r1, (c, d)) -> r2
...
类似这样的事情。
这实际上可能还不够,因为这里有两个 lambda 函数在起作用。
一个检查
left == right
是否相同,另一个检查所有结果 r0, r1, r2, ..., r_n
是否相等。
所以也许是这样的形式
f(accum, (a, b), lambda 1, lambda 2) -> R:
tmp = lambda 1(a, b)
lambda 2(accum, tmp)
这可能不太正常,因为你如何保留
tmp
,并将其作为第二个 lambda 的输入?这似乎是不可能的。也许这不是一步就能完成的。
我唯一能想到的就是这个。它将操作分为两个步骤,而不是使用单个功能函数调用一次完成所有操作。
input_list [1, 1, 1, 1, 1, 1, 1]
import operator
from itertools import pairwise
def all_items_in_list_are_equal(l: list) -> bool:
all_items_are_equal = \
all(
map(
operator.eq,
*pairwise(l)
)
)
return all_items_are_equal
这似乎是一个明显的功能性解决方案,可以生成干净的代码。
它的工作原理是生成一个成对迭代器
pairwise(l)
,它将列表 l
中的相邻元素对作为元组返回。
元组通过
*
运算符扩展为参数对。 operator.eq
需要两个参数,因此 pair
类型的单个参数是行不通的。我们使用 map
将 operator.eq
应用于迭代器生成的每对值。
最后,
all
有效地应用了 lambda 函数来检查所有元素是否都是 True
。
如果有人可以对此进行改进,请发帖。