从字典列表中删除键值对

时间:2012-11-06 15:30:15

标签: python list-comprehension

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

[{'mykey1':'myvalue1', 'mykey2':'myvalue2'}, {'mykey1':'myvalue1a', 'mykey2':'myvalue2a'}]

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

非常感谢

5 个答案:

答案 0 :(得分:16)

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

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

如果您使用的是py {3>,请将.iteritems()替换为.items()

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

[dict((k, v) for k, v in d.iteritems() if k != 'mykey1') for d in mylist]

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

答案 1 :(得分:4)

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)

new_list_of_dict = [ new_dict(d) for d in list_of_dict ]

我选择del而非使用dict.pop,因为如果密钥不存在,pop会取消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 ] 

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

或者:

new_dict_list = [ dict( (k,d.get(k,None)) for k in tuple_keys ) for d in old_dict_list ]

如果旧版本中没有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 ]

根据您所包含/排除的词典的百分比和词典的大小,这可能比@MartijnPieters的解决方案稍快一些。

答案 2 :(得分:0)

[d.pop('mykey1', None) for d in list]

答案 3 :(得分:0)

在python 3.5上可以成功运行 '''结果是我的清单字典'''

[{key: value for key, value in dict.items() if key != 'EQUITY'} for dict in result]

答案 4 :(得分:0)

您可以按照这个简单的步骤操作:

arr = [{'mykey1':'myvalue1', 'mykey2':'myvalue2'}, {'mykey1':'myvalue1a', 'mykey2':'myvalue2a'}]

for i in arr:
    del i["mykey1"]

print(arr)

输出:

[{'mykey2': 'myvalue2'}, {'mykey2': 'myvalue2a'}]