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

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

我需要以下功能:

输入*alist

输出量:

  • True

    如果输入列表中的所有元素使用标准相等运算符计算为相等;
  • False

    不然的话。

性能:当然,我不愿意承担任何不必要的开销。

我觉得最好是:

  • 遍历列表
  • 比较相邻元素
  • AND

    所有结果的布尔值

但我不知道什么是最有效的方法。


编辑:

谢谢你给我这么好的答案。我对几个问题进行了评估,很难在@KennyTM和@Ivo van der Wijk解决方案之间做出选择。

短路特性的缺乏只会对长输入(超过50个元件)造成伤害,而这些输入在早期就有不相等的元件。如果这种情况发生得足够频繁(取决于列表的长度),则需要短路。最好的短路算法似乎是@KennyTM。checkEqual1..但是,它为此付出了很大的代价:

  • 性能最高可达20倍-几乎相同的列表
  • 在短名单上的性能最高可达2.5倍

如果早期不平等元素的长输入没有发生(或很少发生),则不需要短路。到目前为止,最快的是@IvovanderWijk解决方案。


牛魔王的故事
浏览 1468回答 3
3回答

一只甜甜圈

一个比使用在序列(而不是可迭代的)上工作的set()更快的解决方案是简单地计算第一个元素。这假设列表是非空的(但这是很简单的检查,并决定自己的结果应该在一个空的列表上)x.count(x[0]) == len(x)一些简单的基准:>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*5000', number=10000)1.4383411407470703>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*4999+[2]', number=10000)1.4765670299530029>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*5000', number=10000)0.26274609565734863>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*4999+[2]', number=10000)0.25654196739196777

动漫人物

最简单、最优雅的方法如下:all(x==myList[0]&nbsp;for&nbsp;x&nbsp;in&nbsp;myList)(是的,这甚至适用于空列表!这是因为这是python有惰性语义的少数几种情况之一。)关于性能,这将在尽可能早的时间失败,因此它是渐近最优的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python