2010-11-10 18 views

Odpowiedz

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

Oto inna realizacja za pomocą wyrażenia lambda (od kindall):

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

lub 'a = defaultdict (lambda: 1) ' – kindall

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>' 
+2

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

+0

Tak, nie jestem pewien. Może jest pewien wzrost wydajności, przetestuję to później. – Falmarri

+0

Cieszę się, że widzę alternatywę bez lambda. – dividebyzero

4
defaultdict(lambda: 1) 

np

>>> from collections import defaultdict 
>>> a = defaultdict(lambda: 1) 
>>> a["foo"] += 1 
>>> a["foo"] 
2 
Powiązane problemy