Python:如何从AttributeDictionary列表中移除元组内的指定键?
从AttributeDictionary列表中移除指定键的方案分析
首先先明确你的需求:要从att_dict_list这个AttributeDictionary类型的列表里,移除元组('a', 'b', 'e')包含的所有键,你写的代码是:
dict_list = [dict(att_dict.pop(k, None) for k in ('a', 'b', 'e')) for att_dict in att_dict_list]
同时你给出了AttributeDictionary的类定义:
class AttributeDictionary(dict, json_mixin.JsonMixin): def __new__(cls, *args, **kwargs): obj = super(AttributeDictionary, cls).__new__(cls, *args, **kwargs) obj.attr1 = [] return obj def __init__(self, manager=None, *args, **kwargs): super(AttributeDictionary, self)...
先分析你当前代码的效果
这段代码其实完成了两个动作:
- 遍历每个
AttributeDictionary实例,弹出指定的三个键(同时从原实例中移除这些键) - 把每个实例弹出的键值对转换成普通字典,最终收集成
dict_list列表
如果你的目标只是移除这些键,不需要保存被移除的键值对,那这段代码就有点“做多余的事”了——毕竟你额外创建了一堆普通字典,但其实只需要修改原列表里的元素就行。
针对不同需求的优化方案
需求1:仅移除键,不需要保存被移除的内容
这种情况直接遍历修改原列表的元素更高效直观:
for att_dict in att_dict_list: for k in ('a', 'b', 'e'): att_dict.pop(k, None)
这里pop(k, None)的用法很稳妥——即使某个键不存在,也不会抛出KeyError,和你原来的代码逻辑一致。
需求2:需要收集被移除的键值对到普通字典列表
那你原来的代码是完全可行的!因为AttributeDictionary继承自dict,所以pop方法的行为和普通字典完全一致,自定义的__new__和__init__方法(只要正确调用了父类的对应方法)不会影响这个操作。
不过可以稍微优化下可读性,用生成器表达式包裹成字典的写法没问题,也可以写成更清晰的形式:
dict_list = [] for att_dict in att_dict_list: removed_items = {} for k in ('a', 'b', 'e'): removed_items[k] = att_dict.pop(k, None) dict_list.append(removed_items)
两种写法功能完全一样,看你个人习惯选择就行。
关于AttributeDictionary的小提示
因为你的类继承了dict,所以所有字典的内置方法(包括pop、del、keys()等)都能直接使用,不用担心自定义的实例属性attr1会干扰这些字典操作——只要你的__init__方法正确调用了super().__init__()(从你给出的代码片段来看应该是做了的),整个类的字典行为就是正常的。
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

