我创建了一个字典子类,它将在引用
时自动将相同键下的重复值存储在列表中。用Python创建一个具有重复键的字典
class Dictlist(dict):
def __setitem__(self, key, value):
try:
self[key]
except KeyError:
super(Dictlist, self).__setitem__(key, [])
self[key].append(value)
d = Dictlist()
d['test'] = 1
d['test'] = 2
d['test'] = 1
d['test'] = 1
print(d)
{'test' : [1,2,1,1]}
for k,v in d.items():
d[k] = list(set(v))
print(d)
{'test': [1, 2, 1, 1, [1, 2]]}
在本例中,新列表被添加到values列表中。我只需要[1,2]
的值
您已经覆盖了__setitem__
,因此d[k] = list(set(v))
行将调用覆盖并追加到列表中。为了直接设置键,您需要绕过覆盖并访问dict
中的方法。
Dictlist
中提供一个方法。例如:def set_item(self, key, value):
super().__setitem__(key, value)
,然后调用d.set_item(k, list(set(v)))
。
如果这种惟一性是您需要对使用此旁路的字典执行的唯一操作,则可以将所有逻辑放在Dictlist
的一个方法中:
def uniquify(self):
for key in self.keys():
super().__setitem__(key, list(set(self[key])))
如果由于任何原因不能修改Dictlist
,可以从类外绕过:
dict.__setitem__(d, k, list(set(v)))