如何用更Pythonic的写法实现列表中字典的指定键删除?
问题
现有如下代码可实现预期结果,但想找更Pythonic的实现方式,比如用字典推导式或其他更优写法重构这段代码,求解答。
原代码:
positions_list = [{'symbol': 'ARDX', 'description': 'ARDELYX INC', 'quantity': 18.0, 'cost': 162.18, 'market_value': 163.08}, {'symbol': 'GCT', 'description': 'GIGACLOUD TECHNOLOGY I FCLASS A', 'quantity': 2.0, 'cost': 51.4, 'market_value': 51.24}, {'symbol': 'IMPP', 'description': 'IMPERIAL PETROLEUM INC F', 'quantity': 90.0, 'cost': 312.3, 'market_value': 303.3}, {'symbol': 'MREO', 'description': 'MEREO BIOPHARMA GROUP FUNSPONSORED ADR 1 ADR REPS 5 ORD SHS', 'quantity': 21.0, 'cost': 82.32, 'market_value': 82.32}] d, m, c = 'description', 'market_value', 'cost' for key in positions_list: if d in key: del key[d] del key[m] del key[c] positions_list
预期输出:
[{'symbol': 'ARDX', 'quantity': 18.0},{'symbol': 'GCT', 'quantity': 2.0},{'symbol': 'IMPP', 'quantity': 90.0},{'symbol': 'MREO', 'quantity': 21.0}]
解答
1. 生成新列表(推荐:不修改原数据,更安全)
用列表推导式嵌套字典推导式,直接过滤出需要保留的键,逻辑清晰且符合Pythonic风格:
# 定义要保留的键集合 keep_keys = {'symbol', 'quantity'} new_positions = [{k: v for k, v in item.items() if k in keep_keys} for item in positions_list]
也可以反过来,通过定义要移除的键集合来过滤:
# 定义要移除的键集合 remove_keys = {'description', 'market_value', 'cost'} new_positions = [{k: v for k, v in item.items() if k not in remove_keys} for item in positions_list]
2. 原地修改原列表(和原逻辑一致,更简洁)
如果必须修改原列表中的字典,可以简化删除操作,不用逐个del,而是遍历要移除的键集合,用pop方法(带默认值避免键不存在报错):
remove_keys = {'description', 'market_value', 'cost'} for item in positions_list: for k in remove_keys: item.pop(k, None)
小提示
相比原地修改,生成新对象的写法通常更安全——尤其是在后续还要用到原数据、或者多线程场景下,能避免意外修改导致的bug。如果没有特殊需求,优先选生成新列表的方式。
内容的提问来源于stack exchange,提问作者kqd
相关产品推荐
相关产品推荐

