【发布时间】:2011-01-20 20:37:31
【问题描述】:
在 Python 中,是否有一种简单的方法来测试列表中的所有值是否彼此相等?
【问题讨论】:
在 Python 中,是否有一种简单的方法来测试列表中的所有值是否彼此相等?
【问题讨论】:
想到了很多方法。 您可以将其转入编辑:正如另一位发帖人指出的那样,这只适用于可散列类型;我撤销了该建议,因为它的性能更差并且不太通用。set(过滤掉重复项)并检查长度
您可以使用生成器表达式:all(items[0] == item for item in items),它会短路(即,一旦谓词针对某个项目失败而不是继续执行,则立即返回 false)。
【讨论】:
set 解决方案 ;)
>>> a = [1, 1, 1, 1]
>>> len(set(a))
1
请注意,此方法假定列表中的每个元素都可以放入一个集合中。某些类型(例如可变类型)不能放入集合中。
【讨论】:
>>> l = [1, 1, 1, 1]
>>> all(map(lambda x: x == l[0], l))
True
【讨论】:
map 是 Python 3 中的迭代器,因此 all 不会遍历第一个不相等的值。或者在 Python 2 中,使用functools.imap。
Greg Hewgill 指出,使用set 是一个很好的解决方案。这里还有一个比较懒的,所以如果一对元素不相等,其余的就不会比较。在比较所有项目时,这可能比 set 解决方案慢,但没有对其进行基准测试。
l = [1, 1, 1]
all(l[i] == l[i+1] for i in range(len(l)-1))
注意特殊情况all([]) == True。
【讨论】:
l,其中n = len(l) 是奇数并且不会更早终止将尝试访问超出范围的l[n-1+1] = l[n]。
range(len(l)-1),即范围从0到len(l)-2,所以我认为你的反对意见不正确?!