Question

J'essaie de trier un dict en fonction de sa clé et de renvoyer un itérateur aux valeurs à partir d'une méthode iter remplacée dans une classe. Y a-t-il un moyen plus agréable et plus efficace de le faire que de créer une nouvelle liste, en l'insérant dans la liste au fur et à mesure que je trie les clés?

Était-ce utile?

La solution

Que diriez-vous de quelque chose comme ça:

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

Autres conseils

L’approche la plus simple, et certainement la plus rapide, est de loin la suivante:

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

Vous ne pouvez pas trier sans récupérer toutes les clés. Extraire toutes les clés d'une liste, puis trier cette liste est le moyen le plus efficace de le faire. le tri par liste est très rapide, et récupérer la liste des clés est aussi rapide que possible. Vous pouvez ensuite créer une nouvelle liste de valeurs ou générer les valeurs comme dans l'exemple. Gardez à l'esprit que vous ne pouvez pas modifier le dict si vous effectuez une itération dessus (la prochaine itération échouera). Par conséquent, si vous souhaitez modifier le dict avant que vous n'ayez terminé avec le résultat de sort_dict (), faites-le retourner une liste. .

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

Ceci créera une liste intermédiaire unique, la méthode 'sort ()' retournera une liste réelle. Mais au moins, ce n’est qu’un seul.

En supposant que vous souhaitiez un ordre de tri par défaut, vous pouvez utiliser Trier (liste) ou List.sort (). Si vous voulez votre propre logique de tri, les listes Python prennent en charge la possibilité de trier en fonction d'une fonction que vous transmettez. Par exemple, voici une méthode pour trier les nombres du plus petit au plus grand (comportement par défaut) à l'aide d'une fonction.

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

List.Sort(compareTwo)
print a

Sur le plan conceptuel, cette approche est un peu plus propre que la création manuelle d'une nouvelle liste et l'ajout de nouvelles valeurs et vous permet de contrôler la logique de tri.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top