【问题标题】:all list values same [duplicate]所有列表值都相同[重复]
【发布时间】:2011-01-20 20:37:31
【问题描述】:

在 Python 中,是否有一种简单的方法来测试列表中的所有值是否彼此相等?

【问题讨论】:

    标签: python list


    【解决方案1】:

    想到了很多方法。 您可以将其转入set(过滤掉重复项)并检查长度编辑:正如另一位发帖人指出的那样,这只适用于可散列类型;我撤销了该建议,因为它的性能更差并且不太通用。

    您可以使用生成器表达式:all(items[0] == item for item in items),它会短路(即,一旦谓词针对某个项目失败而不是继续执行,则立即返回 false)。

    【讨论】:

    • +1 建议使用列表推导而不是 map()。
    • @Artanis:这不是列表理解 - 这就是为什么它优于 set 解决方案 ;)
    • 谢谢!这是简单而甜蜜的!
    • 啊,我错过了它缺少括号。那么应该是一个生成器。
    • 我还以为是列表推导,叫什么?谢谢
    【解决方案2】:
    >>> a = [1, 1, 1, 1]
    >>> len(set(a))
    1
    

    请注意,此方法假定列表中的每个元素都可以放入一个集合中。某些类型(例如可变类型)不能放入集合中。

    【讨论】:

      【解决方案3】:
      >>> l = [1, 1, 1, 1]
      >>> all(map(lambda x: x == l[0], l))
      True
      

      【讨论】:

      • 请注意,这会无条件地遍历 while 列表(有几个同样简单的解决方案不这样做)。
      • map 是 Python 3 中的迭代器,因此 all 不会遍历第一个不相等的值。或者在 Python 2 中,使用functools.imap
      【解决方案4】:

      Greg Hewgill 指出,使用set 是一个很好的解决方案。这里还有一个比较懒的,所以如果一对元素不相等,其余的就不会比较。在比较所有项目时,这可能比 set 解决方案慢,但没有对其进行基准测试。

      l = [1, 1, 1]
      all(l[i] == l[i+1] for i in range(len(l)-1))
      

      注意特殊情况all([]) == True

      【讨论】:

      • 这会将每个项目与下一个项目进行比较(并为奇数长度的输入引发超出范围的错误)。
      • @delnan:是的,最好只取第一个元素(如果有的话)并将其与所有其他元素进行比较。但是,奇数长度输入是什么意思?
      • 一个l,其中n = len(l) 是奇数并且不会更早终止将尝试访问超出范围的l[n-1+1] = l[n]
      • @delnan:这不正是我回答中的示例所显示的吗?我用的是range(len(l)-1),即范围从0到len(l)-2,所以我认为你的反对意见不正确?!
      • 是的,没关系(不正确,但不会崩溃)。