从字典中的值列表中删除值

时间:2016-05-11 17:16:54

标签: python python-2.7 dictionary

我在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']

4 个答案:

答案 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使用setfrozenset则更快) :

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'])}