我正在尝试从键列表中删除特定值。我遇到类型错误。我编写了添加和删除键的函数。需要从键中删除特定值
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']}
答案 0 :(得分:1)
您在以下方面遇到了一些问题:
def remove_value(self,key,value):
for value in dict.values():
if v in value:
value.remove(v)
dict.values()
,而不是self.values()
;前者试图在没有dict.values
实例的情况下调用dict
进行操作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]
如果要使不存在的键或值分别引发try
或except
,请除去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')