вирок за замовчуванням
"Стандартний словник включає метод setdefault () для отримання значення та встановлення за замовчуванням, якщо значення не існує. Навпаки, defaultdict
дозволяє абоненту вказати типовий (значення, яке потрібно повернути) вперед, коли контейнер ініціалізується."
як визначено Дугом Гелльманом у стандартній бібліотеці Python за прикладом
Як використовувати дефолт
Імпортувати вирок за замовчуванням
>>> from collections import defaultdict
Ініціалізуйте вирок за замовчуванням
Ініціалізуйте його шляхом проходження
називається як її перший аргумент (обов'язковий)
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})
** kwargs як другий аргумент (необов'язково)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
або
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
Як це працює
Оскільки це дочірній клас стандартного словника, він може виконувати всі ті ж функції.
Але у випадку передачі невідомого ключа він повертає значення за замовчуванням замість помилки. Наприклад:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
Якщо ви хочете змінити значення за замовчуванням, перезапишіть default_factory:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})
або
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})
Приклади у питанні
Приклад 1
Оскільки int було передано як default_factory, будь-який невідомий ключ поверне 0 за замовчуванням.
Тепер, коли рядок передається у циклі, це збільшить кількість цих алфавітів у d.
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
Приклад 2
Оскільки список був переданий як default_factory, будь-яка невідома (неіснуюча) клавіша поверне [] (тобто список) за замовчуванням.
Тепер, коли список кортежів передається у циклі, він додасть значення у d [color]
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
default_factory = None
після того, як ви заповнили заповнення за замовчуванням. Дивіться це питання .