Pregunta

Estoy intentando ordenar un dictado según su clave y devolver un iterador a los valores desde un método de iter anulado en una clase.¿Existe una forma mejor y más eficiente de hacer esto que crear una nueva lista e insertarla en la lista mientras ordeno las claves?

¿Fue útil?

Solución

Qué tal algo como esto:

def itersorted(d):
    for key in sorted(d):
        yield d[key]

Otros consejos

Con diferencia, el enfoque más sencillo, y casi con certeza el más rápido, es algo como:

def sorted_dict(d):
    keys = d.keys()
    keys.sort()
    for key in keys:
        yield d[key]

No puede ordenar sin recuperar todas las claves.Obtener todas las claves en una lista y luego ordenar esa lista es la forma más eficiente de hacerlo;La clasificación de listas es muy rápida y recuperar la lista de claves de esa manera es lo más rápido posible.Luego puede crear una nueva lista de valores o generar los valores como lo hace el ejemplo.Tenga en cuenta que no puede modificar el dictado si está iterando sobre él (la siguiente iteración fallaría), por lo que si desea modificar el dictado antes de terminar con el resultado de sorted_dict(), haga que devuelva una lista. .

def sortedDict(dictobj):
    return (value for key, value in sorted(dictobj.iteritems()))

Esto creará una única lista intermedia, el método 'ordenado()' devuelve una lista real.Pero al menos es sólo uno.

Suponiendo que desea un orden de clasificación predeterminado, puede utilizar sorted(list) o list.sort().Si desea su propia lógica de clasificación, las listas de Python admiten la capacidad de ordenar según una función que usted ingresa.Por ejemplo, la siguiente sería una forma de ordenar números de menor a mayor (el comportamiento predeterminado) usando una función.

def compareTwo(a, b):
  if a > b:
    return 1
  if a == b:
    return 0
  if a < b:
    return -1

List.Sort(compareTwo)
print a

Este enfoque es conceptualmente un poco más limpio que crear manualmente una nueva lista y agregar los nuevos valores y le permite controlar la lógica de clasificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top