简体   繁体   中英

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,
  }}

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)]

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. IE 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM