从字典中删除所有键为列表元素的元素

8
如何从字典中删除所有键为列表元素的项?

8
这是功课吗?你可以展示一下你目前为止做的东西吗? - SingleNegationElimination
7个回答

11
[注意:这不是直接的答案,但鉴于之前的猜测问题看起来像作业,我想提供帮助,以便解决问题并从中学习。] 将您的问题分解为以下两个部分:
  1. 如何从列表中获取一个元素
  2. 如何删除字典中的键值对

进一步的帮助:

如何在Python中获得列表的所有元素?

for循环适用于所有序列,而列表是一个序列。

for key in sequence: print key

如何从字典中删除一个元素?

使用 del(key) 方法。

你应该能够同时完成这两个任务。


3
你没有回答问题。你可能指引他朝正确的方向前进,但不是每个人都希望在工作时追寻知识的旅程中快速完成任务。 - Will
3
@Will:我明白了。 我是最早回答这个问题的人之一。从我们的交流中可以看出,这似乎是一道作业题。在Stackoverflow上,我们会劝导不要回答问题,除非提问者已经尝试过。我认为,我提供了一个好的方向,这将对他有所帮助,而不是提供剪切粘贴的解决方案。希望这个背景有所帮助。 - pyfunc

11
for key in list_:
    if key in dict_:
        del dict_[key]

不错,我不知道你可以这样做。我以为你必须使用has_key。谢谢!顺便说一句,del dict_[k] 应该改成 del dict_[key],对吧? - si28719e
4
在Python 3中,key in dict_是检查字典是否存在某个特定键的唯一方法--has_key()方法已被删除。 - Sven Marnach
@Sven Marnach 我也不知道这个!谢谢你提醒我。 - si28719e

7
map(dictionary.__delitem__, lst)

2
只有当lst中的所有元素都在字典中时才有用 - 否则你会在中途某个地方得到一个KeyError。尝试:map(dictionary.__delitem__, filter(dictionary.__contains__, lst)) (虽然事实上,我不太喜欢使用map或列表推导作为普通for循环的替代品。) - PaulMcG
@Paul:我相信gnibbler的回答基本上是正确的,但对于作业来说大多数都不太合适... :) - tzot
是的,我在其他作业问题上也做过同样的事情。 - PaulMcG

1
newdict = dict(
    (key, value) 
    for key, value in olddict.iteritems() 
    if key not in set(list_of_keys)
)

稍后(比如在2012年末):

keys = set(list_of_keys)
newdict =  dict(
    (key, value) 
    for key, value in olddict.iteritems() 
    if key not in keys
)

或者如果您使用的是2.7+版本的Python字典推导:

keys = set(list_of_keys)
newdict =  {
    key: value
    for key, value in olddict.iteritems() 
    if key not in keys
}

或者甚至是在键上执行Python 2.7字典推导加上集合交集:

required_keys = set(olddict.keys()) - set(list_of_keys)
return {key: olddict[key] for key in required_keys}

哦,是的,问题很可能是我在计算所需密钥的条件上反了。


你应该将 set(list_of_keys) 移到循环外面。 - John La Rooy

1
d = {'one':1, 'two':2, 'three':3, 'four':4}
l = ['zero', 'two', 'four', 'five']
for k in frozenset(l) & frozenset(d):
    del d[k]

-1
for i in lst:
    if i in d.keys():
        del(d[i])

这将在每一步构建一个d.keys()的列表或迭代器。你只需要做if i in d:,这将是更短、更高效的方法,而且已经有了这样的答案。 - Vlad Frolov

-2

我对Python一无所知,但我猜你可以遍历列表并通过键从字典中删除条目?


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