2017-07-21 1 views
0

Je voulais trier mon dictionnaire dans l'ordre inverse, l'ordre par dict imbriquée clé 0:Dict dans dict, trier dictionnaire par imbriqué clé

mydict = { 
      'key1': {0: 3, 1: ["doc1.txt", "doc2.txt"], 2: ["text1", "text2"]}, 
      'key2': {0: 8, 1: ["doc6.txt", "doc7.txt"], 2: ["text3", "text4"]}, 
      'key3': {0: 1, 1: ["doc8.txt", "doc9.txt"], 2: ["text7", "text8"]}, 
} 

avoir cet ordre:

'key3': {0: 1, 1: ['doc8.txt', 'doc9.txt'], 2: ['text7', 'text8']} 
'key1': {0: 3, 1: ['doc1.txt', 'doc2.txt'], 2: ['text1', 'text2']} 
'key2': {0: 8, 1: ['doc6.txt', 'doc7.txt'], 2: ['text3', 'text4']} 

Je a essayé:

import operator 

sorted_dict = sorted(mydict.items(), key=operator.itemgetter(0), reverse=True) 

Mais aucun succès.

+0

double possible de [Trier un dictionnaire Python par valeur] (https://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value) –

+1

['trié()'] (https://docs.python.org/ 3/library/functions.html # trié) crée une nouvelle liste triée - dans votre cas, une liste de tuples représentant les éléments du dictionnaire. Les dictons sont toujours non ordonnés en Python. [Le nouvel ordre préservant la représentation dans 3.6 et plus récent] (https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-compactdict) est considéré comme un détail d'implémentation et ne devrait pas être utilisé. Si vous avez besoin d'une dictée ordonnée, utilisez [collections.OrderedDict] (https://docs.python.org/3/library/collections.html#collections.OrderedDict). –

+0

Ce n'est pas clair si l'OP veut trier les éléments de son dictionnaire, ou s'il veut trier les éléments dans le dictionnaire * et les conserver dans une structure de dictionnaire *. Si le premier conseil de @ IljaEverilä est le plus pertinent, si ce dernier, alors ma réponse est. –

Répondre

0

Vous étiez proche, mais je suggère d'utiliser une fonction lambda, qui extrait la valeur pertinente du dictionnaire dans l'index un pour chaque élément; Impression de la sortie dans un format où nous pouvons facilement observer les sorties de commande;

for item in sorted_dict: 
    print(item) 

Quelles sorties;

('key3', {0: 1, 1: ['doc8.txt', 'doc9.txt'], 2: ['text7', 'text8']}) 
('key1', {0: 3, 1: ['doc1.txt', 'doc2.txt'], 2: ['text1', 'text2']}) 
('key2', {0: 8, 1: ['doc6.txt', 'doc7.txt'], 2: ['text3', 'text4']}) 
+0

Merci pour la réponse rapide, cette méthode triée a gardé l'ordre du dictionnaire et du type dict. Cela fonctionnait parfaitement avec mes modèles Jinja2 qui parcouraient les résultats. À votre santé! –

+0

@JozsefTuri Pas de problème :) –

0

Au lieu de:

sorted_dict = sorted(mydict.items(), key=operator.itemgetter(0), reverse=True) 

vous devez utiliser:

sorted_dict = sorted(mydict.items(), key=operator.itemgetter(1)) 

Il triera le dictionnaire à votre entière satisfaction!

0

dictionnaires ne sont pas organisées en Python, et à moins que vous utilisez collections.OrderedDict, vous devrez convertir votre structure tuples et appliquer la fonction sorted

my_dict = mydict.items() 

final = sorted([(a, b.items()) for a, b in my_dict], key=lambda x:x[1][0][1]) 

Sortie:

[('key3', [(0, 1), (1, ['doc8.txt', 'doc9.txt']), (2, ['text7', 'text8'])]), 
('key1', [(0, 3), (1, ['doc1.txt', 'doc2.txt']), (2, ['text1', 'text2'])]), 
('key2', [(0, 8), (1, ['doc6.txt', 'doc7.txt']), (2, ['text3', 'text4'])])]