Python Forum
Sort MULTIDIMENSIONAL Dictionary
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Sort MULTIDIMENSIONAL Dictionary
#1
Hi all,

Im trying to order a Multidimensional dictionary with no success. I get the dict by a function and the result is like this:

Output:
{'Num_Subdir': 11, 'Path': '/root/git/dir1', 'RealSize': '236K', 'Subdir': {'1234': {'Num_Subdir': 10, 'Path': '/root/git/dir1/1234', 'RealSize': '44K', 'Subdir': {'ola000': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola000', 'RealSize': '4,0K', 'Subdir': {}}, 'ola00sd1': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola00sd1', 'RealSize': '4,0K', 'Subdir': {}}, 'ola00sdf': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola00sdf', 'RealSize': '4,0K', 'Subdir': {}}, 'ola1': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola1', 'RealSize': '4,0K', 'Subdir': {}}, 'ola2': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola2', 'RealSize': '4,0K', 'Subdir': {}}, 'ola5': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola5', 'RealSize': '4,0K', 'Subdir': {}}, 'ola6': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola6', 'RealSize': '4,0K', 'Subdir': {}}, 'ola7': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola7', 'RealSize': '4,0K', 'Subdir': {}}, 'ola8': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola8', 'RealSize': '4,0K', 'Subdir': {}}, 'ola9': {'Num_Subdir': 0, 'Path': '/root/git/dir1/1234/ola9', 'RealSize': '4,0K', 'Subdir': {}}}}, 'cece': {'Num_Subdir': 0, 'Path': '/root/git/dir1/cece', 'RealSize': '4,0K', 'Subdir': {}}, 'dir11': {'Num_Subdir': 7, 'Path': '/root/git/dir1/dir11', 'RealSize': '32K', 'Subdir': {'ola1': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola1', 'RealSize': '4,0K', 'Subdir': {}}, 'ola2': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola2', 'RealSize': '4,0K', 'Subdir': {}}, 'ola3': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola3', 'RealSize': '4,0K', 'Subdir': {}}, 'ola5': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola5', 'RealSize': '4,0K', 'Subdir': {}}, 'ola6': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola6', 'RealSize': '4,0K', 'Subdir': {}}, 'ola7': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola7', 'RealSize': '4,0K', 'Subdir': {}}, 'ola9': {'Num_Subdir': 0, 'Path': '/root/git/dir1/dir11/ola9', 'RealSize': '4,0K', 'Subdir': {}}}},
Is bigger but, i only put a bit of the code. Well, now i need to order the dictionary, or the output by Num_Subdir of the root directories, so in the output the first one to show should be the directory with more 'Num_Subdir'. Im using python 3.6 and im tried too many options with no succes..
I need a helping hand!

Thanks.
Reply
#2
Sorting dictionaries is usually making little sense. However, starting from Python 3.7 dictionaries are guaranteed to be in insertion order. So - if you want 'sorted dictionary' then you should build new dictionary by inserting key-value pairs in sorted order.

Still, it seems to me that you actually not wanting to sort dictionary. It seems to me that you actually want sort list (of dictionaries). Meaning that list elements (which happens to be nested dictionaries) must be ordered based on some value in nested dictionary. Is it so? Do you want sort list of dictionaries based on value on first row 'Num_Subdir': 11 in nested dictionary?
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#3
Example of sorting nested dictionary in Python 3.7.

We have three level of dictionaries and we want to sort innermost. In order to do so we have to build new dictionary based on old one by inserting key-value pairs in sorted order to innermost dictionary.

Sample dictionary:

d = {'first_level': 
                    {'second_level': 
                                     {'third_3': 3, 'third_2': 2, 'third_1': 1}}}
First we must 'reach' the innermost dictionary. Let's start with second level:

>>> [v.items() for k, v in d.items()]
[dict_items([('second_level', {'third_3': 3, 'third_2': 2, 'third_1': 1})])]
As we need third level we add one more nesting:

>>> [j.items() for k, v in d.items() for i, j in v.items()]
[dict_items([('third_3', 3), ('third_2', 2), ('third_1', 1)])]
Now we reached level we want to sort. It's time to use built-in function sorted(). As we can see the elements are tuples where value we want to sort is on index 1 (second element). So we add sorting:

>>> [sorted(j.items(), key=lambda x: x[1]) for k, v in d.items() for i, j in v.items()]
[[('third_1', 1), ('third_2', 2), ('third_3', 3)]]
We have sorted third level but this ain't nested dictionary what we had at the beginning. So let's add second level back and turn to dictionary comprehension:

>>> {i: dict(sorted(j.items(), key=lambda x: x[1])) for k, v in d.items() for i, j in v.items()}
{'second_level': {'third_1': 1, 'third_2': 2, 'third_3': 3}}
Lets add first level as well:

>>> {k: {i: dict(sorted(j.items(), key=lambda x: x[1]))} for k, v in d.items() for i, j in v.items()}
{'first_level': {'second_level': {'third_1': 1, 'third_2': 2, 'third_3': 3}}}
We have constructed new dictionary where third level dictionary is insertion sorted based on values. If we want reverse order then we just add reverse=True:

>>> {k: {i: dict(sorted(j.items(), key=lambda x: x[1], reverse=True))} for k, v in d.items() for i, j in v.items()}
{'first_level': {'second_level': {'third_3': 3, 'third_2': 2, 'third_1': 1}}}
Readability is not great but steps are quite simple and one should be able to express it as traditional nested for-loop. I should reiterate that (insertion) ordering of dictionary have meaning only starting from Python 3.6 (dictionaries are insertion ordered) and it's only guaranteed to work startind from Python 3.7 (dictionaries are guaranteed to be insertion ordered)
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Counting Element in Multidimensional List quest_ 1 478 Nov-25-2020, 10:00 PM
Last Post: quest_
  Choose an element from multidimensional array quest_ 2 550 Nov-25-2020, 12:59 AM
Last Post: quest_
  Swap key and value of a dictionary - and sort it Omid 4 695 Oct-28-2020, 01:24 PM
Last Post: Omid
  Jelp with a multidimensional loop Formationgrowthhacking 1 818 Jan-27-2020, 10:05 PM
Last Post: micseydel
  deleting certain rows from multidimensional list aster 4 11,082 Nov-05-2017, 10:52 PM
Last Post: DeaD_EyE
  Looping through multidimensional array saraeauwhy 0 1,581 Aug-21-2017, 09:12 AM
Last Post: saraeauwhy

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020