我在Windows 7中使用Python 2.7。
我有一个字典,想要从另一个字典中删除与(键,值)对相对应的值。
例如,我有一个字典t_dict
。我想删除字典values_to_remove
中的相应(键,值)对,以便我最终使用字典final_dict
t_dict = {
'a': ['zoo', 'foo', 'bar'],
'c': ['zoo', 'foo', 'yum'],
'b': ['tee', 'dol', 'bar']
}
values_to_remove = {
'a': ['zoo'],
'b': ['dol', 'bar']
}
# remove values here
print final_dict
{
'a': ['foo', 'bar'],
'c': ['zoo', 'foo', 'yum'],
'b': ['tee']
}
我在SO和python词典文档上看了类似的页面,但是找不到任何解决这个特定问题的东西:
https://docs.python.org/2/library/stdtypes.html#dict
How to remove dictionaries with duplicate values from a nested dictionary
How to remove a key from a python dictionary?
编辑
每个密钥t_dict
中不能有重复值。例如,永远不会有
t_dict['a'] = ['zoo','zoo','foo','bar']
答案 0 :(得分:5)
试试这个,
for k, v in t_dict.items():
for item in values_to_remove.get(k, ()):
v.remove(item)
# Output
{'a': ['foo', 'bar'], 'c': ['zoo', 'foo', 'yum'], 'b': ['tee']}
答案 1 :(得分:3)
由于重复是不可能的,因此将值存储为set
而不是list
可能是有意义的。如果您可以set
使用t_dict
,则删除过程既快又简单(如果values_to_remove
使用set
或frozenset
则更快) :
for k, toremove in values_to_remove.viewitems():
t_dict.get(k, set()).difference_update(toremove)
如果values_to_remove
预计会很小,或者如果t_dict
较小,请使用以上内容,您可以切换到以下内容以避免临时set()
s(空tuple
是一个单身人士,因此与dict.get
)一起使用它无需任何费用:
for k, v in t_dict.viewitems():
v.difference_update(values_to_remove.get(k, ()))
最终选项是一种过于聪明的方法,只需处理.get
中出现的密钥即可完全消除使用dict
的需要(使用-=
同时需要dict
使用set
可以缩短/缩短值,如果您想允许非difference_update
用于set
&#39},则可以返回values_to_remove
。 s值):
for k in (t_dict.viewkeys() & values_to_remove.viewkeys()):
t_dict[k] -= values_to_remove[k]
答案 2 :(得分:2)
for key,values in values_to_remove.items():
for value in values:
if key in t_dict and value in t_dict[key]:
t_dict[key].pop(t_dict[key].index(value))
答案 3 :(得分:1)
如果您不希望在您的字典中包含重复的元素,并且顺序也不那么重要,那么为什么不使用set
作为您的值?
t_dict = {
'a': set(['zoo', 'foo', 'bar']),
'c': set(['zoo', 'foo', 'yum']),
'b': set(['tee', 'dol', 'bar'])
}
values_to_remove = {
'a': set(['zoo']),
'b': set(['dol', 'bar'])
}
for k,v in values_to_remove.iteritems():
t_dict[k] = t_dict[k]-v
print t_dict
>>>{'a': set(['foo', 'bar']), 'c': set(['foo', 'yum', 'zoo']), 'b': set(['tee'])}
如果订单对您很重要,您也可以在建议的评论中使用@sparkandshine之类的OrderedSet。 http://orderedset.readthedocs.io/en/latest/
from ordered_set import OrderedSet
t_dict = {
'a': OrderedSet(['zoo', 'foo', 'bar']),
'c': OrderedSet(['zoo', 'foo', 'yum']),
'b': OrderedSet(['tee', 'dol', 'bar'])
}
values_to_remove = {
'a': OrderedSet(['zoo']),
'b': OrderedSet(['dol', 'bar'])
}
for k,v in values_to_remove.iteritems():
t_dict[k] = t_dict[k]-v
print t_dict
>>>{'a': OrderedSet(['foo', 'bar']), 'c': OrderedSet(['zoo', 'foo', 'yum']), 'b': OrderedSet(['tee'])}