如何用更简洁高效的方式从Python集合弹出指定元素并返回默认值?
问题
有没有简单的方法(最好是一行代码)实现从Python集合中弹出指定元素,且当元素不存在时返回默认值?目前可通过四行代码、两次哈希表查找实现该功能:
def pop_default(coll: set, v, default=None): if v not in coll: return default coll.remove(v) return v
能否重写该函数,满足以下要求:
- 更紧凑,最好是一行代码;
- 效率至少不低于原实现?
函数使用示例
s = {'a', 'b', 'c'} assert pop_default(s, 'a') == 'a' assert s == {'b', 'c'} assert pop_default(s, 'x') == None assert s == {'b', 'c'}
解决方案
@jonrsharpe 和 @TimurShtatland 提出了两种优化方案:
一行代码实现
def pop_default(s: set, v, default=None): return s.remove(v) or v if v in s else default
这是最优方案,效率与原实现相同,且仅需一行代码。
特殊场景替代方案:基于异常处理
def pop_default(coll: set, v, default=None): try: coll.remove(v) return v except KeyError: return default
在@nocomment的测试中,该方案在触发异常时比原实现慢约5倍,但在不触发异常时速度更快。
内容的提问来源于stack exchange,提问作者makukha
相关产品推荐
相关产品推荐

