python 比较序列是否包含同样元素_python – 检查列表中的所有元素是否相同

一般方法:

def checkEqual1(iterator):

iterator = iter(iterator)

try:

first = next(iterator)

except StopIteration:

return True

return all(first == rest for rest in iterator)

一线:

def checkEqual2(iterator):

return len(set(iterator)) <= 1

还有一线:

def checkEqual3(lst):

return lst[1:] == lst[:-1]

这三个版本的区别是:

>在checkEqual2中,内容必须是可哈希的。

> checkEqual1和checkEqual2可以使用任何迭代器,但checkEqual3必须采用序列输入,通常是具体容器,如列表或元组。

> checkEqual1在找到差异时立即停止。

>由于checkEqual1包含更多的Python代码,所以当许多项目在开始时相等时,效率较低。

>由于checkEqual2和checkEqual3总是执行O(N)复制操作,如果大部分输入将返回False,它们将需要更长时间。

> checkEqual2和checkEqual3不能轻易改变为采用比较a是b而不是a == b。

timeit结果,对于Python 2.7和(只有s1,s4,s7,s9应该返回True)

s1 = [1] * 5000

s2 = [1] * 4999 + [2]

s3 = [2] + [1]*4999

s4 = [set([9])] * 5000

s5 = [set([9])] * 4999 + [set([10])]

s6 = [set([10])] + [set([9])] * 4999

s7 = [1,1]

s8 = [1,2]

s9 = []

我们得到

| checkEqual1 | checkEqual2 | checkEqual3 | checkEqualIvo | checkEqual6502 |

|-----|-------------|-------------|--------------|---------------|----------------|

| s1 | 1.19 msec | 348 usec | 183 usec | 51.6 usec | 121 usec |

| s2 | 1.17 msec | 376 usec | 185 usec | 50.9 usec | 118 usec |

| s3 | 4.17 usec | 348 usec | 120 usec | 264 usec | 61.3 usec |

| | | | | | |

| s4 | 1.73 msec | | 182 usec | 50.5 usec | 121 usec |

| s5 | 1.71 msec | | 181 usec | 50.6 usec | 125 usec |

| s6 | 4.29 usec | | 122 usec | 423 usec | 61.1 usec |

| | | | | | |

| s7 | 3.1 usec | 1.4 usec | 1.24 usec | 0.932 usec | 1.92 usec |

| s8 | 4.07 usec | 1.54 usec | 1.28 usec | 0.997 usec | 1.79 usec |

| s9 | 5.91 usec | 1.25 usec | 0.749 usec | 0.407 usec | 0.386 usec |

注意:

# http://stackoverflow.com/q/3844948/

def checkEqualIvo(lst):

return not lst or lst.count(lst[0]) == len(lst)

# http://stackoverflow.com/q/3844931/

def checkEqual6502(lst):

return not lst or [lst[0]]*len(lst) == lst

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值