我有这段代码:
>>> my_list = [
... {'key1': 1, 'key2': 1., 'key3': 'a'},
... {'key1': 0, 'key2': 0., 'key3': 'b'}
... ]
>>>
我需要从my_list中删除所有出现的密钥(即'key2'):
>>> my_list = [
... {'key1': 1, 'key3': 'a'},
... {'key1': 0, 'key3': 'b'}
... ]
>>>
这样做的pythonic和更快的模式是什么?
附加说明:'my_list'实际上是一个包含更多行的列表,每个dict都有几十个键。
答案 0 :(得分:5)
for my_dict in my_list:
my_dict.pop('key2', None)
您也可以使用del
删除密钥,但除非您确定它存在于每个字典中,否则您需要明确检查密钥是否存在:
for my_dict in my_list:
if 'key2' in my_dict:
del my_dict['key2']
或:
for my_dict in my_list:
try:
del my_dict['key2']
except KeyError:
pass
最后一段代码是“Pythonic”原则的一个例子,“请求宽恕比允许更容易”,这意味着人们应该优先处理异常,而不是事先做好工作以防止它们发生。但是,它并不是原理的一个非常好的示例,因为在这种情况下,它的代码更多,清晰度没有明显的好处。
答案 1 :(得分:2)
与大多数列表和词典以及python一样,.pop()
是从数据对象中删除项目的最佳方法。
要从每个字典中删除特定键,请使用for
循环遍历字典列表并使用.pop()
(包含要删除的键的参数和None
返回)删除密钥。
for dictionary in list_of_dictionaries:
dictionary.pop(key_you_want_to_pop, None)
有关详细信息,请参阅this。
祝你好运,编码愉快!
答案 2 :(得分:0)
如果您喜欢oneliner,可以使用map
map(lambda d: d.pop('key2', None), my_list)
答案 3 :(得分:0)
有几种方法可以做到这一点。例如。使用列表理解:
my_list = [{'key3': 'a', 'key2': 1.0, 'key1': 1}, {'key3': 'b', 'key2': 0.0, 'key1': 0}]
my_new_list = [{y[0]:y[1] for y in x.items() if y[0] != "key2"} for x in my_list]
使用此方法删除键列表(创建新列表):
my_new_list = [{y[0]:y[1] for y in x.items() if y[0] not in ["key2", "key3"]} for x in my_list]
注意: OP接受了这个答案;最有可能的原因是,在撰写本文时,它是唯一一个可以从列表中删除多个键的人。但是,此解决方案会创建新的词典并将其添加到新列表中;它不会修改原始列表。如果你想保留原始列表,这一切都很好,但它必然比修改列表到位要慢。我的笔记本电脑上的一些粗略的timeit
测试显示,pop
循环中的for
ping比此答案中的解决方案快3到3.5倍。
始终为工作选择合适的工具。