M Usman Wahab
M Usman Wahab

Reputation: 83

Nested Python Dictionary Sorting

I have a python dictionary with the following format.

{'range_qty': 
  {'0 to 10 qty': 5,
  'more than 5000 qty': 18,
  '500 to 1000 qty': 20,
  '200 to 500 qty': 19,
  '1000 to 5000 qty': 15,
  '10 to 50 qty': 3,
  '50 to 200 qty': 14}}

How can I sort this dictionary by the key ? I need output like

{'range_qty': 
  {'0 to 10 qty': 5,
  '10 to 50 qty': 3,
  '50 to 200 qty': 14,
  '200 to 500 qty': 19,
  '500 to 1000 qty': 20,
  '1000 to 5000 qty': 15,
  'more than 5000 qty': 18,
  }}

Upvotes: 0

Views: 70

Answers (2)

Chris Doyle
Chris Doyle

Reputation: 11992

Depending on your python version your dict by default might not store order. However if you wanted to iterate over this dict in the order you listed you can use sort if you make your keys uniform. I.E make them all start with an int. So instead of more than 5000 qty you could change it to 5000 or more qty

data = {'range_qty':
  {'0 to 10 qty': 5,
  '5000 or more qty': 18,
  '500 to 1000 qty': 20,
  '200 to 500 qty': 19,
  '1000 to 5000 qty': 15,
  '10 to 50 qty': 3,
  '50 to 200 qty': 14}}

for qty in sorted(data['range_qty'], key=lambda text: int(text.split()[0])):
    print(f"{qty}: {data['range_qty'][qty]}")

OUTPUT

0 to 10 qty: 5
10 to 50 qty: 3
50 to 200 qty: 14
200 to 500 qty: 19
500 to 1000 qty: 20
1000 to 5000 qty: 15
5000 or more qty: 18

Upvotes: 0

Rakesh
Rakesh

Reputation: 82765

Using a custom sort.

Ex:

import sys


def cust_sort(val):
    i = val[0].split(" ", 1)[0]
    if not i.isdigit():
        return sys.maxsize
    return int(i)

data = {'range_qty': 
  {'0 to 10 qty': 5,
  'more than 5000 qty': 18,
  '500 to 1000 qty': 20,
  '200 to 500 qty': 19,
  '1000 to 5000 qty': 15,
  '10 to 50 qty': 3,
  '50 to 200 qty': 14}}

data = sorted(data['range_qty'].items(), key=cust_sort)
#or data = {'range_qty': dict(sorted(data['range_qty'].items(), key=cust_sort))}
print(data)

Output:

[('0 to 10 qty', 5),
 ('10 to 50 qty', 3),
 ('50 to 200 qty', 14),
 ('200 to 500 qty', 19),
 ('500 to 1000 qty', 20),
 ('1000 to 5000 qty', 15),
 ('more than 5000 qty', 18)]

Upvotes: 1

Related Questions