Python3中是否存在可返回元素是否实际被添加的集合元素添加方法?
你好呀!很理解你想通过“复用集合添加操作的返回结果”来提升性能的需求——毕竟Kotlin里的set.add()能直接返回布尔值,告诉你元素到底有没有被成功添加(也就是之前是否不存在于集合中),这种写法确实简洁又高效。
不过很遗憾地告诉你:Python 3的原生set类里并没有这样的add方法,它的add()不管元素是否已经存在,都会固定返回None,这一点你看文档没找到对应的方法是完全正确的。
你提到的先判断elem in myset再执行add的写法,确实会触发两次集合查找操作(一次判断存在性,一次添加时再检查一次),理论上有可以优化的空间。这里给你几个替代思路:
利用集合长度的变化间接判断:
因为set的len()是O(1)操作,我们可以在添加前记录集合长度,添加后对比长度是否变化,来判断元素是否是重复的:myset = set() for elem in arr: prev_len = len(myset) myset.add(elem) if len(myset) == prev_len: return 'duplicate found'这种写法只调用一次
add,通过长度变化间接判断,不过实际性能和先判断再添加的差别可能很小,因为add内部本身还是会做存在性检查。封装自定义集合类:
如果想让写法更接近Kotlin的风格,可以自己封装一个继承自set的类,添加一个能返回添加结果的方法:class CheckableSet(set): def add_with_check(self, elem): if elem in self: return False self.add(elem) return True使用的时候就可以像这样写:
myset = CheckableSet() for elem in arr: if not myset.add_with_check(elem): return 'duplicate found'不过本质上这还是把“判断+添加”的逻辑封装了起来,和你原本的写法性能差不多,胜在代码更整洁。
另外要说明的是,Python的set底层是哈希表实现,elem in myset和add操作都是平均O(1)时间复杂度,所以即使是两次操作,在大多数场景下性能表现都足够好,除非你处理的是超大规模的数据集,那可能需要考虑更底层的优化方案。
备注:内容来源于stack exchange,提问作者Alexander Ites

