2017-02-09 24 views

Odpowiedz

9

Dla defaultdict wartość domyślny jest zwykle nie naprawdę wartość, to fabryka: metoda, która generuje nową wartość. Można rozwiązać ten problem za pomocą wyrażenia lambdaktóry generuje listę:

lst = lambda:list(range(0,5)) 
d = defaultdict(lst)

Jest to również dobry pomysł tutaj, ponieważ w przeciwnym razie wszystkie wartości domyślne by odniesienia tej samej listy. Na przykład tutaj:

d[1].append(14) 

będzie nie mieć wpływ na d[2] (biorąc pod uwagę zarówno d[1] i d[2] nie istnieje).

Ty można jednak osiągnąć ten z:

val = list(range(0,5)) 
lst = lambda:val 
d = defaultdict(lst) 

Ale może to mieć niepożądane skutki uboczne: jeśli tu wykonać d[1].append(14) następnie d[2] będzie [1,2,3,4,5,12] i d[1] is d[2] będzie True:

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from collections import defaultdict 
>>> val = list(range(0,5)) 
>>> lst = lambda:val 
>>> d = defaultdict(lst) 
>>> d[1] 
[0, 1, 2, 3, 4] 
>>> d[1].append(14) 
>>> d[2] 
[0, 1, 2, 3, 4, 14] 
>>> d[1] is d[2] 
True 

natomiast:

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from collections import defaultdict 
>>> lst = lambda:list(range(0,5)) 
>>> d = defaultdict(lst) 
>>> d[1] 
[0, 1, 2, 3, 4] 
>>> d[1].append(14) 
>>> d[2] 
[0, 1, 2, 3, 4] 
>>> d[1] is d[2] 
False 
+0

ładnie wyjaśnione. –

+0

@ Jean-FrançoisFabre: dziękuję :) –

+0

Więc nie mogę użyć defaultdict na istniejącej liście, powiedz 'a = [5,2,3]'? – Arcyno

5

Należy dokonać parametru a można wywoływać, na przykład, używając lambda:

from collections import defaultdict 

d = defaultdict(lambda: list(range(0,5))) 
print(d[0]) 
# [0, 1, 2, 3, 4] 
4

Default dictionary akceptuje wpłacone jako pierwszy argument (który jest fabrycznie dla nie zdefiniowanych wartości), więc to, co chcesz zrobić, to następny krok:

from collections import defaultdict 


default_factory = (lambda: list(range(0,5)) 
d = defaultdict(default_factory) 

Zobacz więcej o wpłacone w What is a "callable" in Python? SO pytanie.

Powiązane problemy