我喜欢 EnricoGiampieri (above) 的函数,但有一个更简单的版本,使用 @987654325 的 "Itertools recipes" 部分中的 all_equal @文档:
from itertools import groupby
def all_equal(iterable):
"Returns True if all the elements are equal to each other"
g = groupby(iterable)
return next(g, True) and not next(g, False)
所有这些食谱都是packaged in more_itertools:
几乎所有这些配方和许多其他配方都可以从 Python 包索引上的 more-itertools 项目中安装:
pip install more-itertools
扩展工具提供与底层工具集相同的高性能。卓越的内存性能是通过一次处理一个元素来保持的,而不是一次将整个可迭代对象全部放入内存。通过以有助于消除临时变量的功能样式将工具链接在一起,可以保持较小的代码量。通过更喜欢“矢量化”构建块而不是使用导致解释器开销的 for 循环和生成器来保持高速。
from more_itertools import all_equal
all_equal(map(type, iterable))
或使用isinstance 和已知类型int(根据原始问题)
all_equal(map(lambda x: isinstance(x, int), iterable))
这两种方法比 Enrico 的建议更简洁,并且像 Enrico 的函数一样处理“void iterators”(例如range(0))。
all_equal(map(type, range(0))) # True
all_equal(map(type, range(1))) # True
all_equal(map(type, range(2))) # True
all_equal(map(lambda x: isinstance(x, int), range(0))) # True
all_equal(map(lambda x: isinstance(x, int), range(1))) # True
all_equal(map(lambda x: isinstance(x, int), range(2))) # True