Python 去除序列s中的重复元素
1.在可hash的情况下使用set,时间复杂度为 O(n)
1 | return list ( set (s)) |
2.不可hash,但支持比较使用sort,时间复杂度为 O(nlogn)
1 2 3 4 5 6 7 | t = list (s) try : t.sort() except TypeError: del t else : return [x for i,x in enumerate (t) if not i or t[i]! = t[i - 1 ]] |
3.前两者都不能的情况下利用in判断,时间复杂度为 O(n**2)
1 2 3 4 5 | u = [] for x in s: if x not in u: u.append(x) return u |
关于是否hashable的一些注意事项:
-
如果一个对象拥有在其生命周期内不变的hash值(即有hash()方法),则其hashable,可变对象如list不可hash
-
可哈希对象拥有__eq__()和__cmp__()方法,相等的两个对象hash值也相等
-
字典的key和set中的元素必须是可hash的,因为数据结构内部使用其hash值
-
如果一个class没有定义cmp和eq方法的话,他是不能定义hash操作的;如果定义了前两个而未定义hash方法亦不能在需要hash的序列中使用其实例
-
一个可变的class是不能定义hash方法的,哪怕其定义了cmp和eq方法
-
用户自定义的class默认具有__cmp__()和__eq__()方法,其对象只有在跟自己比较时才相等,x.__hash__()返回id(x)
-
不可hash的class可显示定义 __hash__=None
转载请注明出处:http://www.cnblogs.com/moinmoin/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· AI浏览器自动化实战
· Chat to MySQL 最佳实践:MCP Server 服务调用
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· .NET周刊【3月第5期 2025-03-30】
· 重生之我是操作系统(八)----文件管理(上)