从字典列表中删除键值对

dub*_*ech 8 python list-comprehension

我有一个词典列表,例如:

[{'mykey1':'myvalue1', 'mykey2':'myvalue2'}, {'mykey1':'myvalue1a', 'mykey2':'myvalue2a'}]
Run Code Online (Sandbox Code Playgroud)

我需要从密钥等于mykey1的所有字典中删除所有键值对.我可以通过循环并使用del语句来做到这一点,但我想知道如何使用列表推导或lambdas创建一个新列表,它将删除密钥为mykey1的所有键值对.

非常感谢

Mar*_*ers 17

如果你真的想使用列表理解,请将它与dict理解结合起来:

[{k: v for k, v in d.iteritems() if k != 'mykey1'} for d in mylist]
Run Code Online (Sandbox Code Playgroud)

替换.iteritems().items(),如果你是蟒蛇3.

在python 2.6及以下,你应该使用:

[dict((k, v) for k, v in d.iteritems() if k != 'mykey1') for d in mylist]
Run Code Online (Sandbox Code Playgroud)

因为{key: value ...}dict理解语法仅在Python 2.7和3中引入.

  • @dublintech:你使用了错误的语法; 它是整个方括号,而不是花括号:`[dict((k,v)代表k,v代表d.iteritems()如果k代表mytuple)对于d in mylist]`.`k in mytuple`表达式很好. (2认同)

mgi*_*son 7

def new_dict(old_dict):
    n = old_dict.copy()
    n.pop('mykey1',None)
    return n

new_list_of_dict = map(new_dict,list_of_dict)
Run Code Online (Sandbox Code Playgroud)

或者

new_list_of_dict = [ new_dict(d) for d in list_of_dict ]
Run Code Online (Sandbox Code Playgroud)

我没有使用del,而是选择了if key 不存在dict.poppop会抑制。KeyError


如果你真的只想获得某些密钥,这会变得更容易一些。

from operator import itemgetter
tuple_keys = ('key1','key2','key3')
get_keys = itemgetter(*tuple_keys)
new_dict_list = [ dict(zip(tuple_keys,get_keys(d)) for d in old_dict_list ] 
Run Code Online (Sandbox Code Playgroud)

KeyError如果键不在旧字典中,则会引发该错误

或者:

new_dict_list = [ dict( (k,d.get(k,None)) for k in tuple_keys ) for d in old_dict_list ]
Run Code Online (Sandbox Code Playgroud)

key:None如果key不在旧字典中,它也会添加。如果你不想这样None,你可以这样做:

new_dict_list = [ dict( (k,d[k]) for k in tuple_keys if k in d) for d in old_dict_list ]
Run Code Online (Sandbox Code Playgroud)

根据您要包含/排除的字典的百分比以及字典的大小,这可能比 @MartijnPieters 的解决方案稍快。