[Python 3.1]defaultdict con un parametro al costruttore di classe
voglio defaultdict(int)
, tranne che mi piacerebbe il valore di default di essere 1
piuttosto che 0
.
- Esiste un modo efficace per farlo?
- Devo farlo?
[Python 3.1]defaultdict con un parametro al costruttore di classe
voglio defaultdict(int)
, tranne che mi piacerebbe il valore di default di essere 1
piuttosto che 0
.
>>> def f():
return 1
>>> a = defaultdict(f)
>>> a[1]
1
Ecco un'altra implementazione utilizzando un'espressione lambda (da Kindall):
>>> a = defaultdict(lambda: 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>'
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
Sì, non ne sono sicuro. Forse c'è un guadagno in termini di prestazioni, lo proverò in seguito. – Falmarri
Sono felice di vedere un'alternativa senza aghi. – dividebyzero
defaultdict(lambda: 1)
es
>>> from collections import defaultdict
>>> a = defaultdict(lambda: 1)
>>> a["foo"] += 1
>>> a["foo"]
2
o 'un = defaultdict (lambda: 1) ' – kindall