4

I have a dictionary:

sequence = {
   'group4': {'shutdown_grace': 300, 'startup_order': 4, 'warmup_time': 300, 'shutdown_order': 6, 'servers': ['group4_1', 'group4_2']},
   'group1': {'shutdown_grace': 300, 'startup_order': 1, 'warmup_time': 900, 'shutdown_order': 10, 'servers': ['group1_1', 'group1_2', 'group1_3']}, 
   'group3': {'shutdown_grace': 300, 'startup_order': 3, 'warmup_time': 900, 'shutdown_order': 7, 'servers': ['group3_1', 'group3_2']},
   'group2': {'shutdown_grace': 300, 'startup_order': 2, 'warmup_time': 900, 'shutdown_order': 8, 'servers': ['group2_1', 'group2_2']}
}

I wanted to create a loop that will go through this list using a value in the sequence dictionary (e.g. sequence['group4']['startup_order']). How do I do this using sorted()?

I tried using this:

for k, v in sorted(sequence.items(), key=sequence[k]['startup_order']):
  print(k, v)

but it's throwing an error: UnboundLocalError: local variable 'k' referenced before assignment

FrancisV
  • 1,619
  • 5
  • 21
  • 36
  • 3
    A key function has to be a _function_. This is explained pretty nicely, with examples, in the [Sorting HOWTO](https://docs.python.org/3/howto/sorting.html#key-functions) in the official docs. – abarnert Apr 03 '18 at 04:42
  • see this: https://stackoverflow.com/questions/613183/how-do-i-sort-a-dictionary-by-value – Badri Gs Apr 03 '18 at 05:26

2 Answers2

4

For sorted try using a lambda for the key like:

Code:

for k, v in sorted(sequence.items(), key=lambda x: x[1]['startup_order']):
    print(k, v)

Test Code:

sequence = {
    'group4': {'shutdown_grace': 300, 'startup_order': 4,
               'warmup_time': 300, 'shutdown_order': 6,
               'servers': ['group4_1', 'group4_2']},
    'group1': {'shutdown_grace': 300, 'startup_order': 1,
               'warmup_time': 900, 'shutdown_order': 10,
               'servers': ['group1_1', 'group1_2', 'group1_3']},
    'group3': {'shutdown_grace': 300, 'startup_order': 3,
               'warmup_time': 900, 'shutdown_order': 7,
               'servers': ['group3_1', 'group3_2']},
    'group2': {'shutdown_grace': 300, 'startup_order': 2,
               'warmup_time': 900, 'shutdown_order': 8,
               'servers': ['group2_1', 'group2_2']}
}

for k, v in sorted(sequence.items(), key=lambda x: x[1]['startup_order']):
    print(k, v)

Results:

('group1', {'servers': ['group1_1', 'group1_2', 'group1_3'], 'shutdown_grace': 300, 'startup_order': 1, 'shutdown_order': 10, 'warmup_time': 900})
('group2', {'servers': ['group2_1', 'group2_2'], 'shutdown_grace': 300, 'startup_order': 2, 'shutdown_order': 8, 'warmup_time': 900})
('group3', {'servers': ['group3_1', 'group3_2'], 'shutdown_grace': 300, 'startup_order': 3, 'shutdown_order': 7, 'warmup_time': 900})
('group4', {'servers': ['group4_1', 'group4_2'], 'shutdown_grace': 300, 'startup_order': 4, 'shutdown_order': 6, 'warmup_time': 300})
Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
1

You can just do with Sorted() and then convert it into Ordered dict :

import collections

data=collections.OrderedDict(sorted(sequence.items(),key=lambda x:x[1]['shutdown_order']))

Now data is a dict, on which you can iterate like a normal dict :

for i,j in data.items():
   print(i,j)

output:

group4 {'shutdown_grace': 300, 'warmup_time': 300, 'startup_order': 4, 'servers': ['group4_1', 'group4_2'], 'shutdown_order': 6}
group2 {'shutdown_grace': 300, 'warmup_time': 900, 'startup_order': 2, 'servers': ['group2_1', 'group2_2'], 'shutdown_order': 8}
group1 {'shutdown_grace': 300, 'warmup_time': 900, 'startup_order': 1, 'servers': ['group1_1', 'group1_2', 'group1_3'], 'shutdown_order': 10}
group3 {'shutdown_grace': 300, 'warmup_time': 900, 'startup_order': 3, 'servers': ['group3_1', 'group3_2'], 'shutdown_order': 70}
Van Peer
  • 2,127
  • 2
  • 25
  • 35
Aaditya Ura
  • 12,007
  • 7
  • 50
  • 88