2015-05-20 12 views
15

Sono nuovo in Python e ho letto alcuni frammenti di codice da qualche parte. È un'implementazione del tipo di conteggio.defaultdict con valore predefinito 1?

Il codice è il seguente:

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 

Come nelle prime due righe del func, è

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

io non sono del tutto chiaro su questo initialization.Could gentilmente aiutarmi figura fuori? e inoltre, sostituiremo semplicemente queste due linee con il seguente?

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

finché si sta importando da collezioni, può anche semplicemente usare un 'Counter'. – Kevin

+2

Il valore di default non v'è 1, è 0. –

+2

Prova' ht = defaultdict (lambda : 1) # con valore predefinito 1' ed elimina il precedente 'ht = {}' che non realizza nulla dal momento che cambiate il valore di 'ht' nella riga successiva. – martineau

risposta

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

defaultdict s sono diversi da dict in quanto quando si tenta di accedere a una regolare dict con una chiave che non esiste, solleva un KeyError.
defaultdict, tuttavia, non genera un errore: crea la chiave per te. Con quale valore? Con il ritorno del callabe hai passato come argomento. In questo caso, ogni nuova chiave verrà creata con il valore 0 (che è il ritorno della semplice funzione lambdalambda:0), che corrisponde anche allo stesso valore di int(), quindi in in questo caso, non ci sarebbe alcuna differenza in modifica della funzione predefinita su int().

Abbattimento questa linea in maggior dettaglio: ht = defaultdict(lambda:0, ht)

Il primo argomento è una funzione, che è un oggetto richiamabile. Questa è la funzione che verrà chiamata per creare un nuovo valore per una chiave inesistente. Il secondo argomento, ht, è facoltativo e fa riferimento al dizionario di base sul quale verrà creato il nuovo defaultdict. Pertanto, se ht avesse alcune chiavi e valori, lo defaultdict avrebbe anche queste chiavi con i valori corrispondenti. Se hai provato ad accedere a queste chiavi, otterresti i vecchi valori. Tuttavia, se non si supera il dizionario di base, verrà creato un nuovo defaultdict e, quindi, tutte le nuove chiavi a cui si accede otterranno il valore predefinito restituito dal chiamabile.
(in questo caso, come ht è inizialmente un vuoto dict, non ci sarebbe alcuna differenza nel fare ht = defaultdict(lambda:0), ht = defaultdict(int) o ht = defaultdict(lambda:0, ht): sarebbero stati tutti costruire lo stesso defaultdict

+0

(lambda: 0, ht) è solo per essere chiamabile con 0? – chancyWu

+0

Questo è corretto. Ho modificato il post per scomporlo in modo più dettagliato – RafaelC

+0

Interessante questo è! Dove posso imparare di più tali concetti? –

25

Penso che si può semplicemente passare un lambda. funzione che restituisce 1

d = defaultdict(lambda:1) 
+3

questo è corretto. non la risposta accettata. – jimh

Problemi correlati