如果字典项的键不在列表中,如何使用 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 dct
是 O(1)
,而查找 k in lst
是 O(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) 中不存在的值。
如何删除大量不在列表中的字典项?例如,有一个字典 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.
获取新字典的最简单方法是遍历列表,而不是字典:
new_dict = {k: dct[k] for k in lst if k in dct}
请注意,这是 O(N)
键而不是 O(M * N)
键和字典。查找 k in dct
是 O(1)
,而查找 k in lst
是 O(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) 中不存在的值。