2016-10-24 6 views
0
class Bag: 
    def __init__(self, i=None): 
     self.bag = [] 
     if i == None: 
      pass # i is None, do nothing after create empty bag 
     elif type(i)==list: 
      self.bag.extend(i) # append whole list i into bag with extend method 
     else: 
      self.bag.append(i) # append single item i into bag 

    def __repr__(self): 
     for s in self.bag : 
      return s 

    def __str__(self): 
     for s in self.bag : 
      return s 

In der __str__method. Es sollte eine Zeichenfolge zurückgeben.wie Sie eine Liste in eine bestimmte Zeichenfolge ändern.

Die Liste ist Bag (['a', 'c', 'b', 'b', 'd', 'd', 'd']). Und

__str__ is supposed to return Bag(a[1], c[1], b[2], d[3]) 

Kann mir jemand sagen, wie es funktioniert? Danke vielmals.

+0

Beide for-Schleifen geben die ersten s zurück und stoppen dann. – elethan

+0

anstatt 'type (i) == list', sind Sie besser dran mit' isinstance (i, list) 'oder sogar' isinstance (i, collections.Iterable) ' – mgilson

Antwort

1

können Sie einen collections.Counter hier verwenden zu helfen:

def __str__(self): 
    counts = Counter(self.bag) 
    count_str = ','.join('{}[{}]'.format(k, v) for k, v in counts.items()) 
    return 'Bag({})'.format(count_str) 

Das Tolle an diesem ist, dass der Zähler macht die ganze Arbeit, herauszufinden, wie viele der einzelnen Elemente in Ihrem bag sind. Der ganze Rest ist nur Formatierungsdetails. Ein Nachteil ist, dass der Zähler nicht bestellt ist. Wenn Sie eine Bestellung wünschen, können Sie die .most_common-Methode verwenden (die die Häufigkeiten von der gebräuchlichsten zu der am wenigsten üblichen anordnet), oder Sie könnten etwas wie ordered unique recipe verwenden, um herauszufinden, wie Sie über den Zähler iterieren möchten.

+0

Die Verwendung eines Counters verhindert den Zweck der Implementierung eines Beutels (Tasche = Zähler). Er sollte ein Wörterbuch verwenden, um den Artikel von Anfang an zu speichern. –

+0

@AdamVanProoyen - Es ist wahr, dass 'Counter' eine wirklich schöne' Tasche' macht (und das ist es auch). Es ist mir ein wenig unklar, wie OP den obigen Code verwenden wird, aber es könnte einfach eine Algorithmenübung sein, und er/sie möchte ein kurzes 'str' /' repr' während des Debuggens oder etwas überprüfen ... – mgilson

Verwandte Themen