基于条件删除字典中的条目。

33
我有一个字典,其中名字是键,(年龄,出生日期)元组是这些键的值。例如:
dict = {'Adam' : (10, '2002-08-13'),
        'Eve'  : (40, '1972-08-13')}

我想删除所有age > 30的key,这些key的值是元组,其中age是元组中的一个值。如何做到这一点?我正在使用dict[name][0]来访问每个key的age,其中dict是我的字典。

1个回答

62

通常的做法是创建一个只包含你想要保留的项目的新字典:

new_data = {k: v for k, v in data.items() if v[0] <= 30}
如果您需要就地更改原始字典,可以使用 for 循环:
for k, v in list(data.items()):
    if v[0] > 30:
        del data[k]

请注意:list(data.items()) 创建了一个字典项的浅拷贝,即创建了一个新列表,其中包含所有键和值的引用,因此在循环内部修改原始字典是安全的。


1
@JustinCarrey:这是有特别的原因吗?(有合理的原因;我只是好奇。) - Sven Marnach
2
@JustinCarrey:由于只复制指针,创建一个新字典与直接更改旧字典一样高效。在这种情况下,我甚至认为它是更高效的解决方案。for循环需要先将所有项的指针复制到列表中,而字典推导式仅复制我们想要保留的指针。 - Sven Marnach
@SvenMarnach 我需要这样做以有效利用内存。我有一个非常大的字典,我不能承担复制它的代价。你觉得有办法吗? - navidoo
@navidoo:这只创建了字典的浅层副本,因此您可能无法获得更多的内存效率。然而,在内存中过滤几乎不适合的字典似乎本来就是一个值得怀疑的事情。 - Sven Marnach
2
@Dev 不,修改正在迭代的字典是不安全的。但这个答案中的代码并没有这样做;在Python 2中使用data.items()或在Python 3中使用list(data.items())会创建一个字典项列表,然后迭代该新列表,而不是原始字典。(我将从这个答案中删除Python 2部分 - 我想它们已经不再相关了。) - Sven Marnach
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接