web-dev-qa-db-fra.com

Comment créer un OrderedDict en Python?

J'ai essayé de maintenir l'ordre d'un dictionnaire Python, car dict en natif n'a aucun ordre. Beaucoup de réponses dans SE suggèrent d'utiliser OrderedDict.

from collections import OrderedDict

domain1 = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }

domain2 = OrderedDict({ "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  })

print domain1
print " "    
for key,value in domain1.iteritems():
    print (key,value)

print " "

print domain2
print ""
for key,value in domain2.iteritems():
    print (key,value)

Après itération, j'ai besoin du dictionnaire pour conserver sa commande d'origine et imprimer la clé et les valeurs de la même manière:

{
    "de": "Germany",
    "sk": "Slovakia",
    "hu": "Hungary",
    "us": "United States",
    "no": "Norway"
}

De toute façon, j'ai utilisé ne conserve pas cet ordre, cependant.

6
Eka

Vous devez lui passer un itératif ou insérer des éléments dans l'ordre - c'est ainsi qu'il connaît l'ordre. Essayez quelque chose comme ça:

from collections import OrderedDict

domain = OrderedDict([('de', 'Germany'),
                      ('sk', 'Slovakia'),
                      ('hu', 'Hungary'),
                      ('us', 'United States'),
                      ('no', 'Norway')])

Le tableau étant itératif, OrderedDict saura l'ordre que vous souhaitez.

6
Mark Meyer

Dans le cas OrderedDict, vous créez un dictionnaire intermédiaire, régulier (et donc non ordonné) avant qu'il ne soit transmis au constructeur. Afin de conserver cet ordre, vous devrez soit passer quelque chose d'ordre au constructeur (par exemple une liste de n-uplets), soit ajouter les clés une par une dans l'ordre souhaité (éventuellement en boucle).

2
Jared Goguen

Réponse tardive, mais voici un dictionnaire python 3.6+oneliner à sort de keysans utiliser imports:

d = { "de": "Germany", "sk": "Slovakia", "hu": "Hungary",
    "us": "United States", "no": "Norway"  }
d_sorted = {k: v for k, v in sorted(d.items(), key=lambda x: x[1])}
print(d_sorted)

Sortie:

{'de': 'Germany', 'hu': 'Hungary', 'no': 'Norway', 'sk': 'Slovakia', 'us': 'United States'}

Démo Python

0
Pedro Lobito

Vous pouvez utiliser OrderedDict mais vous devez prendre en compte que OrderedDict ne fonctionnera pas en dehors de votre code en cours d'exécution.

Cela signifie que l'exportation de l'objet au format JSON perdra tous les effets de OrderedDict.

Ce que vous pouvez faire est de créer un tableau de métadonnées dans lequel vous pouvez stocker les clés "de", sk", etc. de manière ordonnée. En parcourant le tableau dans l'ordre, vous pouvez vous référer correctement au dictionnaire et l'ordre dans le tableau survivra à toute exportation au format JSON, YAML, etc.

JSON actuel:

{ "de": "Germany", "sk": "Slovakia", "hu": "Hungary", "us": "United States", "no": "Norway"  }

Nouvel objet countries:

countries = {
  "names" : { 
    "de": "Germany", "sk": "Slovakia", "hu": "Hungary", "us": "United States", "no": "Norway"  
  },
  "order" : [ 
    "de", "sk", "hu", "us", "no" 
  ]
}

Code qui imprimera les noms longs dans l'ordre:

for code in countries['order']:
 print(countries['names'][code])
0
Fabien