python ¿Cómo funciona collections.defaultdict?



6 Answers

defaultdict significa que si no se encuentra una clave en el diccionario, en lugar de que se KeyError un KeyError , se crea una nueva entrada. El tipo de esta nueva entrada viene dado por el argumento de defaultdict.

Por ejemplo:

somedict = {}
print(somedict[3]) # KeyError

someddict = defaultdict(int)
print(someddict[3]) # print int(), thus 0
python dictionary default-value defaultdict

He leído los ejemplos en documentos de Python, pero aún no puedo entender qué significa este método. ¿Alguien puede ayudar? Aquí hay dos ejemplos de los documentos de Python

>>> from collections import defaultdict

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

y

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

Los parámetros int y list son para que?




Aquí hay una gran explicación de los defaultdicts: http://ludovf.net/blog/python-collections-defaultdict/

Básicamente, los parámetros int y list son funciones que se pasan. Recuerde que Python acepta nombres de funciones como argumentos. int devuelve 0 de forma predeterminada y la lista devuelve una lista vacía cuando se llama entre paréntesis.

En los diccionarios normales, si en su ejemplo intento llamar d[a] , obtendré un error (KeyError), ya que solo existen las claves m, s, iyp y la clave a no se ha inicializado. Pero en un punto predeterminado, toma el nombre de una función como un argumento, cuando intenta usar una clave que no se ha inicializado, simplemente llama a la función que ha pasado y asigna su valor de retorno como el valor de la nueva clave.




Mi propio 2 ¢: también puede subclase defaultdict:

class MyDict(defaultdict):
    def __missing__(self, key):
        value = [None, None]
        self[key] = value
        return value

Esto podría ser útil para casos muy complejos.




Sin el defaultdict , es probable que pueda asignar nuevos valores a las claves que no se defaultdict , pero no puede modificarlo. Por ejemplo:

import collections
d = collections.defaultdict(int)
for i in range(10):
  d[i] += i
print(d)
# Output: defaultdict(<class 'int'>, {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9})

import collections
d = {}
for i in range(10):
  d[i] += i
print(d)
# Output: Traceback (most recent call last): File "python", line 4, in <module> KeyError: 0



El diccionario estándar incluye el método setdefault () para recuperar un valor y establecer un valor predeterminado si el valor no existe. Por el contrario, defaultdict le permite a la persona que llama especificar el valor predeterminado por adelantado cuando se inicializa el contenedor.

import collections

def default_factory():
    return 'default value'

d = collections.defaultdict(default_factory, foo='bar')
print 'd:', d
print 'foo =>', d['foo']
print 'bar =>', d['bar']

Esto funciona bien siempre y cuando sea apropiado que todas las claves tengan el mismo valor predeterminado. Puede ser especialmente útil si el valor predeterminado es un tipo utilizado para agregar o acumular valores, como una lista, un conjunto o incluso un int. La documentación estándar de la biblioteca incluye varios ejemplos del uso de defaultdict de esta manera.

$ python collections_defaultdict.py

d: defaultdict(<function default_factory at 0x100468c80>, {'foo': 'bar'})
foo => bar
bar => default value






Related