web-dev-qa-db-fra.com

Ordre des clés dans les dictionnaires Python

Code:

d = {'a': 0, 'b': 1, 'c': 2}
l = d.keys()

print l

Ceci affiche ['a', 'c', 'b']. Je ne sais pas comment la méthode keys détermine l'ordre des mots-clés dans l . Toutefois, j'aimerais pouvoir retrouver les mots-clés dans l'ordre "approprié". Le bon ordre bien sûr créerait la liste ['a', 'b', 'c'].

67
rectangletangle

Vous pouvez utiliser OrderedDict (requiert Python 2.7) ou une version ultérieure.

Notez également que OrderedDict({'a': 1, 'b':2, 'c':3}) ne fonctionnera pas, car la dict que vous créez avec {...} a déjà oublié l'ordre des éléments. Au lieu de cela, vous souhaitez utiliser OrderedDict([('a', 1), ('b', 2), ('c', 3)]).

Comme mentionné dans la documentation, pour les versions inférieures à Python 2.7, vous pouvez utiliser this recipe.

65
Abhinav Gupta

Python 3.7+

En Python 3.7.0 le caractère de préservation de l'ordre d'insertion de dict objects a été déclaré comme faisant partie intégrante des spécifications du langage Python. Par conséquent, vous pouvez en dépendre.

Python 3.6 (CPython)

A partir de Python 3.6, pour l’implémentation CPython de Python, les dictionnaires maintiennent l’ordre d’insertion par défaut. Ceci est considéré comme un détail de mise en œuvre cependant; vous devriez toujours utiliser collections.OrderedDict si vous voulez un ordre d'insertion garanti par d'autres implémentations de Python.

Python> = 2.7 et <3.6

Utilisez la classe collections.OrderedDict lorsque vous avez besoin d'une dict qui rappelle L'ordre des éléments insérés.

42
Eugene Yarmash
>>> print sorted(d.keys())
['a', 'b', 'c']

Utilisez la fonction sorted , qui trie l’itéré transmis.

La méthode .keys() renvoie les clés dans un ordre arbitraire.

40
Mike Lewis

Il suffit de trier la liste lorsque vous souhaitez l'utiliser.

l = sorted(d.keys())
10
Drew

De http://docs.python.org/tutorial/datastructures.html :

"La méthode keys () d'un objet dictionnaire renvoie la liste de toutes les clés utilisées dans le dictionnaire, dans un ordre arbitraire (si vous souhaitez le trier, appliquez simplement la fonction trié ())."

10
shelman

Bien que l'ordre n'ait pas d'importance car le dictionnaire est hashmap. Cela dépend de l'ordre dans lequel il est poussé:

s = 'abbc'
a = 'cbab'

def load_dict(s):
    dict_tmp = {}
    for ch in s:
        if ch in dict_tmp.keys():
            dict_tmp[ch]+=1
        else:
            dict_tmp[ch] = 1
    return dict_tmp

dict_a = load_dict(a)
dict_s = load_dict(s)
print('for string %s, the keys are %s'%(s, dict_s.keys()))
print('for string %s, the keys are %s'%(a, dict_a.keys()))

sortie:
pour la chaîne abbc, les clés sont dict_keys (['a', 'b', 'c'])
pour la chaîne cbab, les clés sont dict_keys (['c', 'b', 'a'])

0
zehai