如何使用Python从值列表中删除特定值

时间:2019-08-05 16:34:49

标签: python dictionary

我正在尝试从键列表中删除特定值。我遇到类型错误。我编写了添加和删除键的函数。需要从键中删除特定值

class my_dict(dict):    
    def add(self, key, value):
        self.setdefault(key, []).append(value)

    def remove_key(self, key):
        del self[key]

    #Error part
    def remove_value(self,key,value):
        for value in dict.values():
            if v in value:
                value.remove(v)

dict_obj = my_dict()
dict_obj.add('key1', 'value1')
dict_obj.add('key2', 'value2')
dict_obj.add('key1', 'value3')
print(dict_obj)  

>>{'key1': ['value1', 'value3'], 'key2': ['value2']}


dict_obj.remove_value('key1','value3')
print(dict_obj)  

我的出场

TypeError: descriptor 'values' of 'dict' object needs an argument

所需的输出

>>{'key1': ['value1'], 'key2': ['value2']}

2 个答案:

答案 0 :(得分:1)

您在以下方面遇到了一些问题:

def remove_value(self,key,value):
    for value in dict.values():
        if v in value:
            value.remove(v)
  1. 您使用的是dict.values(),而不是self.values();前者试图在没有dict.values实例的情况下调用dict进行操作
  2. 您为value命名了两件事,并且替换了另一件事(在使用v时却没有命名任何v

最小修复为:

def remove_value(self,key,v):  # Name argument v to match test and remove
    for value in self.values():  # Call values on self
        if v in value:
            value.remove(v)

可读性更强的修补程序(这也将删除限制为指定的key,因为您收到一个key自变量,我想这是意图)

def remove_value(self, key, toremove):
    try:
        self[key].remove(toremove)
    except (KeyError, ValueError):
        pass
    else:
        if not self[key]:
            del self[key]

如果要使不存在的键或值分别引发tryexcept,请除去KeyError / ValueError块。如果即使所有值都删除了,也想保留一个键,请删除else块。

答案 1 :(得分:1)

如果self[key].value,您需要将其从value in self[key]中删除:

def remove_value(self,key,value):
    if value in self.get(key, []):
        self[key].remove(value)

但与您的previous related question类似,这似乎比使用defaultdict更适合于尝试猴子补丁自己的类似字典的对象。

from collections import defaultdict
mydict = defaultdict(list)
mydict['key1'].append('value1')
mydict['key1'].append('value3')
mydict['key2'].append('value2')
if 'value3' in mydict['key1']:
    mydict['key1'].remove('value3')