我需要一个函数,它接受一个list
和输出True
如果使用标准相等运算符将输入列表中的所有元素计算为彼此相等并且False
否则。
我觉得最好遍历列表比较相邻元素,然后AND
所有生成的布尔值。但我不确定最 Pythonic 的方法是什么。
Use itertools.groupby (see the itertools recipes):
from itertools import groupby
def all_equal(iterable):
g = groupby(iterable)
return next(g, True) and not next(g, False)
或没有groupby
:
def all_equal(iterator):
iterator = iter(iterator)
try:
first = next(iterator)
except StopIteration:
return True
return all(first == x for x in iterator)
您可以考虑多种替代的俏皮话:
-
将输入转换为集合并检查它是否只有一个或零个(如果输入为空)项目
def all_equal2(iterator):
return len(set(iterator)) <= 1
-
与没有第一项的输入列表进行比较
def all_equal3(lst):
return lst[:-1] == lst[1:]
-
计算第一个项目在列表中出现的次数
def all_equal_ivo(lst):
return not lst or lst.count(lst[0]) == len(lst)
-
与重复的第一个元素的列表进行比较
def all_equal_6502(lst):
return not lst or [lst[0]]*len(lst) == lst
但它们也有一些缺点,即:
-
all_equal
and all_equal2
可以使用任何迭代器,但其他迭代器必须采用序列输入,通常是列表或元组等具体容器。
-
all_equal
and all_equal3
一旦发现差异就停止(所谓的“短路"),而所有替代方案都需要迭代整个列表,即使您可以知道答案是False
只需查看前两个元素即可。
- In
all_equal2
内容必须是hashable。列表列表将引发TypeError
例如。
-
all_equal2
(在最坏的情况下)和all_equal_6502
创建列表的副本,这意味着您需要使用双倍的内存。
在 Python 3.9 上,使用perfplot,我们得到这些时间(较低Runtime [s]
更好):
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)