[python] ¿Cómo funciona collections.defaultdict?



Answers

defaultdict significa que si una clave no se encuentra en el diccionario, en lugar de 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
Question

He leído los ejemplos en documentos de Python, pero todavía 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 qué?




Mi propio 2 ¢: también puedes 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 un defaultdict , probablemente pueda asignar nuevos valores a las claves no vistas, 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



La herramienta defaultdict es un contenedor en la clase de colecciones de Python. Es similar al contenedor de diccionario (dict) habitual, pero tiene una diferencia: el tipo de datos de los campos de valor se especifica al inicializarse.

Por ejemplo:

from collections import defaultdict

d = defaultdict(list)

d['python'].append("awesome")

d['something-else'].append("not relevant")

d['python'].append("language")

for i in d.items():

    print i

Esto imprime:

('python', ['awesome', 'language'])
('something-else', ['not relevant'])



Hay una gran explicación de los predeterminados aquí: http://ludovf.net/blog/python-collections-defaultdict/

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

En diccionarios normales, si en su ejemplo intento llamar a d[a] , obtendré un error (KeyError), ya que solo existen las teclas m, s, i y p y la clave a no se ha inicializado. Pero en un fallo por defecto, toma un nombre de función como argumento, cuando intenta utilizar una clave que no se ha inicializado, simplemente llama a la función que pasó y asigna su valor de retorno como el valor de la nueva clave.









Related