2017-07-29 6 views
0

ce faisant pour un devoir, ne comprennent pas comment cela fonctionnerait, donc l'explication avec des étapes aidera beaucoup. La question est difficile à comprendre, donc n'ont pas pu comprendre et essayer. Voici la question, divisée en 3 parties. Vous obtenez la superclasse suivante. Ne modifiez pas cela.python travaillant avec des classes ajoutant joindre des éléments de suppression

class Container(object): 
    """ Holds hashable objects. Objects may occur 0 or more times """ 
    def __init__(self): 
     """ Creates a new container with no objects in it. I.e., any object 
      occurs 0 times in self. """ 
     self.vals = {} 
    def insert(self, e): 
     """ assumes e is hashable 
      Increases the number times e occurs in self by 1. """ 
     try: 
      self.vals[e] += 1 
     except: 
      self.vals[e] = 1 
    def __str__(self): 
     s = "" 
     for i in sorted(self.vals.keys()): 
      if self.vals[i] != 0: 
       s += str(i)+":"+str(self.vals[i])+"\n" 
     return s 

Écrivez une classe qui implémente les spécifications ci-dessous. Ne remplacez aucune méthode de Container.

class Bag(Container): 
    def remove(self, e): 
     """ assumes e is hashable 
      If e occurs one or more times in self, reduces the number of 
      times it occurs in self by 1. Otherwise does nothing. """ 
     # write code here 
def count(self, e): 
    """ assumes e is hashable 
     Returns the number of times e occurs in self. """ 
    # write code here 

• Par exemple, d1 = Sac()

d1.insert(4) 
d1.insert(4) 
print(d1) 
d1.remove(2) 
print(d1) 
prints 4:2 
4:2 

• Par exemple, d1 = Sac()

d1.insert(4) 
d1.insert(4) 
d1.insert(4) 
print(d1.count(2)) 
print(d1.count(4)) 
prints 0 
3 

Deuxième partie:

Ecrivez une méthode Sac tel que si b1 et b2 étaient des sacs alors b1 + b2 donne un nouveau sac représentant l'union des deux sacs.

• Par exemple, a = Sac()

a.insert(4) 
a.insert(3) 
b = Bag() 
b.insert(4) 
print(a+b) 
prints 3:1 
4:2 

troisième partie:

Ecrivez une classe qui implémente les spécifications ci-dessous. Ne remplacez aucune méthode de Container.

class ASet(Container): 
    def remove(self, e): 
     """assumes e is hashable 
      removes e from self""" 
     # write code here 
def is_in(self, e): 
    """assumes e is hashable 
     returns True if e has been inserted in self and 
     not subsequently removed, and False otherwise.""" 
    # write code here 

• Par exemple, d1 = ARéglez()

d1.insert(4) 
d1.insert(4) 

d1.remove(2) 
print(d1) 

d1.remove(4) 
print(d1) 
prints 4:2 # from d1.remove(2) print 

    # (empty) from d1.remove(4) print 
• For example, d1 = ASet() 
d1.insert(4) 
print(d1.is_in(4)) 
d1.insert(5) 
print(d1.is_in(5)) 
d1.remove(5) 
print(d1.is_in(5)) 
prints True 
True 
False 

Merci.

+0

Corrigez votre indentation. – Rahul

+0

Cela ressemble plus à une question pour votre professeur ou TA - vous êtes simplement en train de jeter tout un ensemble de problèmes ici. Si vous pouvez l'affiner à quelque chose de spécifique et montrer au moins une tentative de résoudre cela, alors il pourrait être sur le sujet. Sinon, c'est trop large. –

+0

Avez-vous eu la troisième partie correcte? –

Répondre

1

Si vous voulez écrire une sous-classe, la première chose que vous devez faire est de comprendre la classe que vous voulez sous-classer. Donc, la première chose que vous devez faire est de comprendre ce que fait Container. Il a deux méthodes magiques, __init__ et __str__, et une méthode ordinaire, insert. Explorez insert d'abord en faisant ceci:

d1 = Container() 
d1.insert(4) 
print(d1) 
d1.insert(2) 
print(d1) 
d1.insert(4) 
print(d1) 

Vous obtenez cette sortie:

4:1 

2:1 
4:1 

2:1 
4:2 

Il y a 3 séries de réponses, un de chaque appel print(). Pouvez-vous voir ce qui se passe? Lorsque vous insérez 4, vous voyez 4:1. Si vous insérez 4 une seconde fois, vous voyez 4:2. En d'autres termes, la représentation de chaîne que vous voyez est la valeur:compte.

Cela fonctionne parce que Container a le membre vals qui est un dictionnaire. Chaque élément du dictionnaire est valeur:compter, tout comme dans la représentation sous forme de chaîne.

Votre première tâche consiste à écrire une sous-classe Bag qui fait tout ce qui Container, mais il dispose également des méthodes remove et count.

La méthode count produit simplement la même réponse pour une valeur en Container que __str__ produit pour toutes les valeurs. Choisissez la valeur correspondante dans le dictionnaire et renvoyez le nombre d'occurrences. Notez qu'il est correct de demander le compte d'une valeur qui n'est pas là: retourner 0 dans ce cas.

class Bag(Container): 
    def count(self, e): 
     return self.vals.get(e,0) 

Vérifiez que cela fonctionne:

d1 = Bag() 
d1.insert(4) 
d1.insert(4) 
print(d1.count(4)) 

L'autre moitié de ce bit est d'écrire remove qui est à l'opposé de insert. Que fait insert? Si la valeur que vous insérez est déjà dans vals, elle augmente le nombre, sinon elle définit le nombre à 1. Donc, remove doit diminuer le nombre, et s'il passe à zéro, supprime l'élément du dictionnaire. Notez qu'il est acceptable d'essayer de supprimer une valeur qui n'existe pas: il suffit de l'ignorer dans ce cas.

def remove(self, e): 
     if e not in self.vals: 
      return 
     self.vals[e] -= 1 
     if self.vals[e] < 1: 
      del(self.vals[e]) 

Soyez prudent lorsque vous ajoutez ce bit de code. L'indentation doit s'aligner avec count.

Maintenant que vous avez les bases, votre prochaine tâche est d'écrire une méthode __add__ qui ajoute deux sacs ensemble. En d'autres termes donné Bag s a et b, vous devez combiner a.vals et b.vals. Commencez avec une copie de a et ajoutez-y le contenu de b. Vous avez déjà une méthode à faire pour ajouter: utilisez la méthode insert.

def __add__(self, other): 
     result = self.__class__() 
     result.vals.update(self.vals) 
     for value,count in other.vals.items(): 
      for _ in range(count): 
       result.insert(value) 
     return result 

Soyez prudent lorsque vous ajoutez ce bit de code. L'indentation doit s'aligner avec count.

La troisième partie de votre question est vraiment une répétition de la première partie. La méthode remove est la même. La méthode is_in est la même que count, sauf qu'elle renvoie True ou False au lieu d'un nombre.

+0

En python 3, vous pouvez simplement utiliser '__class __()' au lieu de 'self .__ classe __()' –

+0

pouvez-vous donner le code exact de la méthode is_in? –

+0

Pas même prêt à essayer, hein? 'return e in self.vals' – BoarGules