¿Cómo se ordena Counter / defaultdict en Python 3.7?
Sabemos que en Python 3.6 los diccionarios se ordenan por inserción como un detalle de implementación, y en 3.7 se puede confiar en el orden de inserción.
Esperaba que este también fuera el caso para las subclases dedict
comocollections.Counter
ycollections.defaultdict
. Pero esto parece ser cierto solo para ladefaultdict
case.
Así que mis preguntas son:
¿Es cierto que el orden se mantiene paradefaultdict
pero no paraCounter
? Y, si es así, ¿hay una explicación directa?ebería ordenar estosdict
subclases en elcollections
módulo se considerará detalles de implementación? O, por ejemplo, ¿podemosconfia endefaultdict
siendo la inserción ordenada comodict
en Python 3.7 +?Aquí están mis pruebas rudimentarias:
dict: ordenó
words = ["oranges", "apples", "apples", "bananas", "kiwis", "kiwis", "apples"]
dict_counter = {}
for w in words:
dict_counter[w] = dict_counter.get(w, 0)+1
print(dict_counter)
# {'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2}
Contador: desordenado
from collections import Counter, defaultdict
print(Counter(words))
# Counter({'apples': 3, 'kiwis': 2, 'oranges': 1, 'bananas': 1})
defaultdict: ordenado
dict_dd = defaultdict(int)
for w in words:
dict_dd[w] += 1
print(dict_dd)
# defaultdict(<class 'int'>, {'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2})