2010-11-10 20 views

risposta

14
>>> def f(): 
     return 1 
>>> a = defaultdict(f) 
>>> a[1] 
1 

Ecco un'altra implementazione utilizzando un'espressione lambda (da Kindall):

>>> a = defaultdict(lambda: 1) 
+11

o 'un = defaultdict (lambda: 1) ' – kindall

1

Dalla documentazione:

La funzione int() che restituisce sempre zero è solo un caso speciale di funzioni costanti. Un modo più veloce e più flessibile per creare funzioni costanti è utilizzare itertools.repeat(), che può fornire un valore costante (non solo zero):

>>> def constant_factory(value): 
...  return itertools.repeat(value).next 
>>> d = defaultdict(constant_factory('<missing>')) 
>>> d.update(name='John', action='ran') 
>>> '%(name)s %(action)s to %(object)s' % d 
'John ran to <missing>' 
+2

Mi è capitato di aver letto questo nei documenti di recente e non potevo credere che suggerissero di usare' itertools.repeat() 'quando un banale' lambda' come @gnibbler suggerisce che funziona altrettanto bene, è più semplice, e comporta molto meno overhead - parla di overkill ... – martineau

+0

Sì, non ne sono sicuro. Forse c'è un guadagno in termini di prestazioni, lo proverò in seguito. – Falmarri

+0

Sono felice di vedere un'alternativa senza aghi. – dividebyzero

4
defaultdict(lambda: 1) 

es

>>> from collections import defaultdict 
>>> a = defaultdict(lambda: 1) 
>>> a["foo"] += 1 
>>> a["foo"] 
2 
Problemi correlati