如何将一组多个值添加到一个键?
问题描述:
我创建了一个基本上是爱好书的类。这本书可以通过两种方法进行访问,enter(n,h)
,它需要一个名字并且不断添加爱好到这个名字(一个名字可以有多个爱好)。另一种方法返回一组特定名称的业余爱好。我的爱好书是存储我插入一个名字的每一个爱好。有人可以帮我修理它吗?如何将一组多个值添加到一个键?
class Hobby:
def __init__(self):
self.dic={}
self.hby=set()
def enter(self,n,h):
if n not in self.dic.items():
self.dic[n]=self.hby
for k in self.dic.items():
self.hby.add(h)
def lookup(self,n):
return self.dic[n]
我试图运行下列情形
d = Hobby(); d.enter('Roj', 'soccer'); d.lookup('Roj')
{'soccer'}
d.enter('Max', 'reading'); d.lookup('Max')
{'reading', 'soccer'} #should return just reading
d.enter('Roj', 'music'); d.lookup('Roj')
{'reading', 'soccer','music'} #should return soccer and music
答
你为什么要重新发明这里dict
?为什么你要使用一个单独的集合,并且总是为其添加值,并将其引用到每个确保它总是在查找时返回相同集合的键?
不要重新发明轮子,用collections.defaultdict
:
import collections
d = collections.defaultdict(set)
d["Roj"].add("soccer")
d["Roj"]
# {'soccer'}
d["Max"].add("reading")
d["Max"]
# {'reading'}
d["Roj"].add("music")
d["Roj"]
# {'soccer', 'music'}
。
UPDATE - 如果你真的想这样做,通过自己的类(和之前你做什么,看Stop Writing Classes!),你可以做到这一点是:
class Hobby(object):
def __init__(self):
self.container = {}
def enter(self, n, h):
if n not in self.container:
self.container[n] = {h}
else:
self.container[n].add(h)
def lookup(self, n):
return self.container.get(n, None)
d = Hobby()
d.enter("Roj", "soccer")
d.lookup("Roj")
# {'soccer'}
d.enter("Max", "reading")
d.lookup("Max")
# {'reading'}
d.enter("Roj", "music")
d.lookup("Roj")
# {'soccer', 'music'}
注意没有额外的设置是如何使用在这里 - 每个dict
密钥都有自己的set
来填充。