如何将一组多个值添加到一个键?

问题描述:

我创建了一个基本上是爱好书的类。这本书可以通过两种方法进行访问,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来填充。