为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牛魔王的故事 2019-07-08 15:45:36
检查列表中的所有元素是否相同我需要以下功能:输入*alist输出量:True如果输入列表中的所有元素使用标准相等运算符计算为相等;False不然的话。性能:当然,我不愿意承担任何不必要的开销。我觉得最好是:遍历列表比较相邻元素和AND所有结果的布尔值但我不知道什么是最有效的方法。编辑:谢谢你给我这么好的答案。我对几个问题进行了评估,很难在@KennyTM和@Ivo van der Wijk解决方案之间做出选择。短路特性的缺乏只会对长输入(超过50个元件)造成伤害,而这些输入在早期就有不相等的元件。如果这种情况发生得足够频繁(取决于列表的长度),则需要短路。最好的短路算法似乎是@KennyTM。checkEqual1..但是,它为此付出了很大的代价:性能最高可达20倍-几乎相同的列表在短名单上的性能最高可达2.5倍如果早期不平等元素的长输入没有发生(或很少发生),则不需要短路。到目前为止,最快的是@IvovanderWijk解决方案。
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

一个比使用在序列(而不是可迭代的)上工作的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


查看完整回答
反对 回复 2019-07-08
?
动漫人物

TA贡献1815条经验 获得超10个赞

最简单、最优雅的方法如下:

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

(是的,这甚至适用于空列表!这是因为这是python有惰性语义的少数几种情况之一。)

关于性能,这将在尽可能早的时间失败,因此它是渐近最优的。


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 1467 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信