从dict python列表中删除所有出现的内容

时间:2016-04-29 12:41:10

标签: python list numpy dictionary scipy

我有这段代码:

>>> 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都有几十个键。

4 个答案:

答案 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倍。

始终为工作选择合适的工具。