[Python 3.1]defaultdict con un parámetro al constructor de la clase
Quiero defaultdict(int)
, excepto que me gustaría que el valor por defecto para ser 1
en lugar de 0
.
- ¿Hay alguna forma ordenada de hacerlo?
- ¿Debo hacer eso?
[Python 3.1]defaultdict con un parámetro al constructor de la clase
Quiero defaultdict(int)
, excepto que me gustaría que el valor por defecto para ser 1
en lugar de 0
.
>>> def f():
return 1
>>> a = defaultdict(f)
>>> a[1]
1
Aquí es otro aplicación usando la expresión lambda (de Kindall):
>>> a = defaultdict(lambda: 1)
A partir de los documentos:
La función int(), que siempre devuelve cero es simplemente un caso especial de funciones constantes. Una forma más rápida y más flexible para crear funciones constantes es utilizar itertools.repeat() que puede suministrar cualquier valor constante (no sólo cero):
>>> 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>'
Sucedí haber leído eso en los documentos recientemente y no podía creer que sugirieran usar' itertools.repeat() 'cuando un' lambda' trivial como @gnibbler sugiere que funciona igual de bien, es más simple, y conlleva mucho menos sobrecarga - hablar sobre overkill ... – martineau
Sí, no estoy seguro. Tal vez haya una ganancia de rendimiento, la probaré más tarde – Falmarri
Estoy feliz de ver una alternativa sin lambda. – dividebyzero
defaultdict(lambda: 1)
por ejemplo
>>> from collections import defaultdict
>>> a = defaultdict(lambda: 1)
>>> a["foo"] += 1
>>> a["foo"]
2
o 'una = defaultdict (lambda: 1) ' – kindall