tuplas recorrer metodos listas español elementos ejemplo diccionarios diccionario dentro agregar python python-2.x

recorrer - ¿Hay una descripción de cómo funciona__cmp__ para los objetos dict en Python 2?



recorrer diccionario python (3)

He estado tratando de hacer una subclase dict UserDict.DictMixin de UserDict.DictMixin que admite claves no hashable. El rendimiento no es una preocupación. Desafortunadamente, Python implementa algunas de las funciones en DictMixin al intentar crear un objeto dict desde la subclase. Puedo implementar esto yo mismo, pero estoy atascado en __cmp__ .

No puedo encontrar una descripción sucinta de la lógica utilizada por el __cmp__ para la clase dict.


Aquí hay una descripción de __cmp__ , pero creo que lo importante a tener en cuenta es que __cmp__ solo se usa si no se definen los métodos de "comparación rica", como __lt__ y __eq__ . Además, en Python3, __cmp__ se elimina del lenguaje. Entonces tal vez __cmp__ completo y simplemente defina __lt__ y __eq__ .


Si estás preguntando cómo funciona la comparación de diccionarios, es esto:

  • Para comparar los dados A y B, primero compara sus longitudes. Si son desiguales, devuelva cmp (len (A), len (B)).
  • A continuación, encuentre la clave adiff en A, que es la clave más pequeña para la que adiff not in B or A[adiff] != B[adiff] . (Si no existe tal clave, los dictados son iguales.)
  • También encuentre la clave más pequeña bdiff en B para la cual bdiff not in A or A[bdiff] != B[bdiff] .
  • Si adiff! = Bdiff, devuelva cmp (adiff, bdiff). De lo contrario, devuelva cmp (A [adiff], B [bdiff]).

En pseudocódigo:

def smallest_diff_key(A, B): """return the smallest key adiff in A such that adiff not in B or A[adiff] != B[bdiff]""" diff_keys = [k for k in A if k not in B or A[k] != B[k]] return min(diff_keys) def dict_cmp(A, B): if len(A) != len(B): return cmp(len(A), len(B)) try: adiff = smallest_diff_key(A, B) except ValueError: # No difference. return 0 bdiff = smallest_diff_key(B, A) if adiff != bdiff: return cmp(adiff, bdiff) return cmp(A[adiff], b[bdiff])

Esto se traduce de la implementación 2.6.3 en dictobject.c.


Una alternativa es usar Mapping ABC del paquete de collections . Está disponible en 2.6 y hasta Simplemente hereda de las colecciones. __contains__ e __iter__ métodos __getitem__ , __contains__ y __iter__ . Obtienes todo lo demás gratis.