2015-05-20 16 views
15

Ich bin neu in Python, und ich lese ein Code-Snippet von einem Ort. Es ist eine Implementierung des Zählens.defaultdict mit Standardwert 1?

Der Code ist wie folgt:

from collections import defaultdict 
def sort_colors(A): 
    ht = {}      # a hash map 
    ht = defaultdict(lambda:0, ht) # with default value 1 
    for i in A: 
     ht[i] += 1 
    ret = [] 
    for k in [0, 1, 2]: 
     ret.extend([k]*ht[k]) 
    return ret 

Wie in den ersten beiden Zeilen der func, dann ist es

ht = {} 
ht = defaultdict(lambda:0, ht) 

Ich bin nicht ganz klar darüber initialization.Could Sie mich freundlich Figur helfen es aus? und auch, Sollen wir nur diese zwei Zeilen durch folgende ersetzen?

ht = defaultdict(int) # default value 0 
+3

so lange gibt, wie Sie aus den Sammlungen importieren, können auch nur einen 'Counter' verwenden. – Kevin

+2

Der Standardwert gibt es nicht 1 ist, es ist 0. –

+2

Try' ht = defaultdict (lambda : 1) # mit Standardwert 1' und löschen der vorangehende 'ht = {}', der nichts bewirkt, da Sie den Wert von 'ht' in der nächsten Zeile ändern. – martineau

Antwort

16
ht = {} 
ht = defaultdict(lambda:0, ht) 

defaultdict s von dict, dass verschieden sind, wenn Sie versuchen, eine regelmäßige dict mit einem Schlüssel zuzugreifen, die nicht existiert hat, wirft er einen KeyError.
defaultdict verursacht jedoch keinen Fehler: Es erstellt stattdessen den Schlüssel für Sie. Mit welchem ​​Wert? Mit der Rückkehr der callabe übergeben Sie als Argument. In diesem Fall werden alle neuen Schlüssel mit dem Wert 0 (der die einfache lambda-Funktion lambda:0-Funktion lambda:0 ist) erstellt, die auch die gleiche Rückgabe von int() ist, also in in diesem Fall, würde es keinen Unterschied geben Ändern der Standardfunktion auf int().

Aufteilung diese Linie näher: ht = defaultdict(lambda:0, ht)

Das erste Argument ist eine Funktion, die ein aufrufbare Objekt ist. Dies ist die Funktion, die aufgerufen wird, um einen neuen Wert für einen nicht vorhandenen Schlüssel zu erstellen. Das zweite Argument, ht, ist optional und bezieht sich auf das Basiswörterbuch, auf dem das neue defaultdict aufbauen wird. Wenn also ht einige Schlüssel und Werte hätte, hätte der defaultdict auch diese Schlüssel mit den entsprechenden Werten. Wenn Sie versuchen, auf diese Schlüssel zuzugreifen, erhalten Sie die alten Werte. Wenn Sie jedoch das Basiswörterbuch nicht bestanden haben, wird ein brandneues defaultdict erstellt, und alle neuen Schlüssel, auf die zugegriffen wird, erhalten den Standardwert, der von der aufrufbaren zurückgegeben wird.
(in diesem Fall als ht zunächst eine leere dict ist, gäbe es überhaupt ht = defaultdict(lambda:0), ht = defaultdict(int) oder ht = defaultdict(lambda:0, ht) keinen Unterschied dabei: sie würden alle die gleiche defaultdict bauen

+0

(Lambda: 0, ht) soll nur mit 0 aufrufbar sein? – chancyWu

+0

Das ist richtig. Ich habe den Beitrag bearbeitet, um ihn detaillierter zu machen. – RafaelC

+0

Interessant ist das! Wo kann ich mehr solche Konzepte lernen? –

25

Ich glaube, Sie haben soeben einen Lambda passieren kann. Funktion, die 1

d = defaultdict(lambda:1) 
+3

das ist richtig. nicht die akzeptierte Antwort. – jimh