如何检查列表中的所有元素是否相同?

7
如果我有这个列表:
mylist = ['n', 'n', '4', '3', 'w']

如何让程序读取列表,并告诉我它们是否全部相同?

我知道在这个例子中很容易看出它们并不全相同。我有更大的列表需要让程序为我阅读。

我可以通过以下方式进行操作:

min(...)

如果是这样,我该如何输入每个列表项?
2个回答

19

您可以像这样使用set

len(set(mylist)) == 1

解释

集合只存储其中唯一的元素。因此,我们尝试将列表转换为一个集合。转换后,如果集合中有多个元素,则表示列表中不是所有元素都相同。

注意:如果列表中有不可哈希的项目(如列表、自定义类等),则无法使用set方法。但我们可以使用@falsetru建议的第一种方法。

all(x == mylist[0] for x in mylist)

优点:

  1. 它甚至可以使用不可哈希类型。

  2. 它不会在内存中创建另一个临时对象。

  3. 在第一次失败后,它会短路。如果第一个和第二个元素不匹配,则立即返回False,而在set方法中,必须比较所有元素。因此,如果列表很大,您应该首选all方法。

  4. 即使列表实际上为空,它也可以工作。如果可迭代对象中没有元素,则all将返回True。但是空列表将创建一个空的set,其长度为0。


5
请注意,这仅适用于可哈希的项。例如,在一个列表的列表上执行此操作是行不通的。 - Steinar Lima
1
@Tyler:这太聪明了。它会对N个项目的列表中的每个项目进行哈希处理,这可能非常昂贵;而不是仅仅比较它们。 - smci
2
注意边缘情况,例如 mylist = [float('nan')] - wim

14

使用all生成器表达式

all(x == mylist[0] for x in mylist)

替代方案:

mylist.count(mylist[0]) == len(mylist)

注意 第一个选项在列表中发现任何不同的项时就会停止,而另一个选项则不会。


请注意,这也适用于空列表的简单情况(而不是出错)。 - smci
mylist.count?真的吗?我以为那个替代方案是开玩笑加进来的。任何能提前结束的解决方案都比那些不管什么情况都要读完整个序列的方案好。或许可以在空列表的情况下增加保护,或者在你得到一个生成器时转换成迭代器。但是肯定有一些涉及 all 的方案才是正确的选择。 - PaulMcG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接