[Python 3.1]defaultdict z parametr do konstruktora klasy
Chcę defaultdict(int)
wyjątkiem Chciałbym wartość domyślną być 1
zamiast 0
.
- Czy jest jakiś sposób na zrobienie tego?
- Czy powinienem to zrobić?
[Python 3.1]defaultdict z parametr do konstruktora klasy
Chcę defaultdict(int)
wyjątkiem Chciałbym wartość domyślną być 1
zamiast 0
.
>>> def f():
return 1
>>> a = defaultdict(f)
>>> a[1]
1
Oto inna realizacja za pomocą wyrażenia lambda (od kindall):
>>> a = defaultdict(lambda: 1)
Od docs:
int function(), która zawsze zwraca zero jest tylko specjalny przypadek stałych funkcji. Szybszy i bardziej elastyczny sposób tworzenia stałych funkcji jest użycie itertools.repeat(), która może dostarczyć dowolną wartość stałą (nie tylko 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>'
Zdarzyło mi się, że ostatnio przeczytałem to w dokumentach i nie mogłem uwierzyć, że sugerowali użycie' itertools.repeat() 'gdy banalna' lambda' jak @gnibbler sugeruje, że działa równie dobrze, jest prostsze, i pociąga za sobą dużo mniejszy napływ - mów o przesadzie ... – martineau
Tak, nie jestem pewien. Może jest pewien wzrost wydajności, przetestuję to później. – Falmarri
Cieszę się, że widzę alternatywę bez lambda. – dividebyzero
defaultdict(lambda: 1)
np
>>> from collections import defaultdict
>>> a = defaultdict(lambda: 1)
>>> a["foo"] += 1
>>> a["foo"]
2
lub 'a = defaultdict (lambda: 1) ' – kindall