如果字典项的键不在列表中,如何使用 Python 删除它们

How to delete dictionary items if their keys are not in a list, using Python

如何删除大量不在列表中的字典项?例如,有一个字典 dct 和一个列表 `lst:

dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
lst = ['a', 'c']

过滤掉字典的最有效方法是什么,以便得到:

dct.items()

输出:

dict_items([('a', 2), ('c', 6)])

谢谢!

这是一种方法:

dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
lst = ['b', 'd']
ndct = {}
for l in list(dct):
    if l in lst:
        pass
    else:
        ndct[l] = dct[l]

ndct 等于:

{'a': 2, 'c': 6}

要求 改变现有词典,还是生成一个新的、更小的词典好吗?

如果你能制作一本新词典,你的问题的措辞可能会引导你到 Python 的过滤功能,你会按照(假设 key_list 是列表您要保留的关键值):

 new_dict = filter(lambda pair: pair[0] in key_list, old_dict)

您也可以通过字典理解来做到这一点,方法如下:

 new_dict = { key : value for (key, value) in old_dict if key in key_list }

如果您绝对、肯定地必须改变原始字典,在 Python 中有一些方法可以在一行中做到这一点,但它们对 Python 程序员来说并不完全清楚,所以我' d 可能循环执行:

for key in old_dict:
     if key not in key_list:
          del old_dict[key]

这适用于 Python 2 但不适用于 Python 3,其中 for 循环内的删除将中断迭代。对于 Python 3(我认为),您需要执行以下操作:

del_keys = [ key for key in old_dict if key not in key_list ]
for key in del_keys:
     del old_dict[key]

一个简单的代码:

dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
lst = ['b', 'd']

for key in list(dct):
    if key in lst:
        dct.pop(key)

结果:

{'a': 2, 'c': 6}

Mark Byers所说,必须使用list函数获取键的副本,否则会出现“RuntimeError: dictionary changed size during iteration”的错误。适用于 python.

的第 2 版和第 3 版

获取新字典的最简单方法是遍历列表,而不是字典:

new_dict = {k: dct[k] for k in lst if k in dct}

请注意,这是 O(N) 键而不是 O(M * N) 键和字典。查找 k in dctO(1),而查找 k in lstO(N)。假设列表比字典短,如果你有效地这样做,它比遍历字典要好,因为那将是 O(M) > O(N).

如果您的列表保证包含字典元素的子集,您可以完全跳过检查 if k in dct

如果您必须处理原始字典in-place,您可以做以下两件事之一。更简单的解决方案是使用新字典:

new_dict = {k: dct[k] for k in lst if k in dct}
dct.clear()
dct.upate(new_dict)

如果这是作弊,您可以遍历字典。为了快速查找,先把list转成set:

s = set(lst)
for k in list(dct.keys()):
    if k not in lst:
        del dct[k]

您可以找到字典键和列表值之间的交集:

dct = {'a' : 2, 'b' : 4, 'c' : 6, 'd' : 7}
lst = ['a', 'c']

{k: dct[k] for k in dct.keys() & lst}

输出:

{'c': 6, 'a': 2}

您可以使用要从字典中删除的单词列表,如果列表中不存在键,则打印字典。 代码如下:

dct={key:val for key, val in dct.items() if key not in lst}

只需打印 dct.items() 即可得到您想要的结果

您将获得所需的字典输出,其中仅包含列表 (lst) 中不存在的值。