web-dev-qa-db-fra.com

Itérer à travers Python par clés dans l'ordre trié

J'ai un dictionnaire en Python qui ressemble à ceci:

D = {1:'a', 5:'b', 2:'a', 7:'a'}

Les valeurs des clés ne sont généralement pas pertinentes. Existe-t-il un moyen de parcourir le dictionnaire à l'aide de touches dans l'ordre numérique? Les clés sont toutes des entiers.

Au lieu de dire

for key in D:
    # some code...

Puis-je parcourir les touches du dictionnaire dans l'ordre 1, 2, 5, 7?

De plus, je ne peux pas utiliser les fonctions de tri/tri.

32
ben

Vous pouvez utiliser ceci:

for key in sorted(D.iterkeys()):
    .. code ..

Dans Python 3.x, utilisez D.keys() (qui est identique à D.iterkeys() dans Python 2.x ).

42
isedev

En tenant compte de votre stipulation que vous ne souhaitez pas trier et en supposant que les clés sont toutes des entiers, vous pouvez simplement trouver les valeurs maximale et minimale des clés, puis parcourir cette plage et vérifier si chacune est réellement dans le dictionnaire.

for key in xrange(min(D), max(D) + 1):
    if key in D:
        print D[key]

Ce n'est pas très efficace, bien sûr, mais cela va fonctionner, et cela évite le tri.

7
kindall

En supposant que les clés/valeurs sont insérées dans l'ordre, vous pouvez utiliser un OrderedDict :

>>> from collections import OrderedDict
>>> d = OrderedDict()
>>> d[1] = 'a'
>>> d[2] = 'a'
>>> d[5] = 'b'
>>> d[7] = 'a'
>>> d
OrderedDict([(1, 'a'), (2, 'a'), (5, 'b'), (7, 'a')])
>>> d.keys()
[1, 2, 5, 7]
6
JCash

Vous pouvez obtenir la liste des clés à l'aide de dict.keys(), puis parcourir une vue triée de la liste:

for key in sorted(D.keys()):
    print key, D[key]
2
Rohit Jain