0

I have a json/dict in the following format:

{
    "top": 590,
    "left": 105, 
    "width": 240, 
    "height": 40,
    "Zarya": "142612a11ad2ca629d2182a51b23d1f2",
    "Kiriko": "4d0528271fd9d0104cd2af0b1c91f4f6",
    "Echo": "175b9c62c57b0d6e18577f352fad4afc",
    "Sojourn": "8ea40548f4472457cfbd46731958a432",
    "Sombra": "319e88daf8a4b53869c6690cd008ebb0",
    "Genji": "b5a7156b9a1921099a884e62f2f7c774",
    "Reaper": "309527687ec1e89f63cfece162c57a66",
    "Ana": "556e9f3ff210729dc9e1cf848c3c579f",
    "Hanzo": "13d164a4f37fd7562b53ede9f5fd2671",
    "Lucio": "d772ddc7e982cd6d714d0a19753c8b32",
    "Torbjorn": "4fdf46b32b3435c714da7a75ba0ccde2",
    "Junkrat": "be29c9729daf9e46606ffa26638641ea",
    "Moira": "0b54634e09e4d108ca248e4e967d15a1",
    "Mei": "90391ff04b11c73e49c48f9b2738d1b0",
    "Dva": "859012ee744e79a630522190ef8ef92c",
    "Soldier 76": "adbd70e889fe6135f372dbd28b7ae5e6",
    "Winston": "1c4245a79b45f1a0b90e78383078cdd3",
    "Tracer": "b5465050c403b020aac35da073d4ab11",
    "Zenyatta": "dccc24bfe5d7b09df7b1387d4c8dfba7",
    "Baptiste": "4d254bc437560ac21780732fc78ffa08",
    "Sigma": "3c85376aee36a901bcbf24b07cf60aa2",
    "Widowmaker": "049092cbd628a54ed22ae5522ca5681c",
    "Orisa": "113acca96744081964854bd94191310a",
    "Ashe": "48ca311fb1b288bb811965e6d84d1786"
}

I would like to sort everything after top, left, width, height alphabetically by the key, while leaving the first 4 keys at the start. How can I accomplish this?

3
  • Use a text editor like Sublime or Notepad++. Commented Nov 2, 2022 at 1:14
  • 1
    Do you want to sort the in-memory dictionary object, or a json file on disk? Commented Nov 2, 2022 at 1:18
  • @JohnGordon wouldn't the difference between those just be reading/writing the sorted dict to the json file? Commented Nov 2, 2022 at 1:41

3 Answers 3

2

Assuming you're using Python 3.7+ you can use (dct is your dictionary from the question):

items = list(dct.items())
out = dict(items[:4] + sorted(items[4:]))
print(out)

Prints:

{
    "top": 590,
    "left": 105,
    "width": 240,
    "height": 40,
    "Ana": "556e9f3ff210729dc9e1cf848c3c579f",
    "Ashe": "48ca311fb1b288bb811965e6d84d1786",
    "Baptiste": "4d254bc437560ac21780732fc78ffa08",
    "Dva": "859012ee744e79a630522190ef8ef92c",
    "Echo": "175b9c62c57b0d6e18577f352fad4afc",
    "Genji": "b5a7156b9a1921099a884e62f2f7c774",
    "Hanzo": "13d164a4f37fd7562b53ede9f5fd2671",
    "Junkrat": "be29c9729daf9e46606ffa26638641ea",
    "Kiriko": "4d0528271fd9d0104cd2af0b1c91f4f6",
    "Lucio": "d772ddc7e982cd6d714d0a19753c8b32",
    "Mei": "90391ff04b11c73e49c48f9b2738d1b0",
    "Moira": "0b54634e09e4d108ca248e4e967d15a1",
    "Orisa": "113acca96744081964854bd94191310a",
    "Reaper": "309527687ec1e89f63cfece162c57a66",
    "Sigma": "3c85376aee36a901bcbf24b07cf60aa2",
    "Sojourn": "8ea40548f4472457cfbd46731958a432",
    "Soldier 76": "adbd70e889fe6135f372dbd28b7ae5e6",
    "Sombra": "319e88daf8a4b53869c6690cd008ebb0",
    "Torbjorn": "4fdf46b32b3435c714da7a75ba0ccde2",
    "Tracer": "b5465050c403b020aac35da073d4ab11",
    "Widowmaker": "049092cbd628a54ed22ae5522ca5681c",
    "Winston": "1c4245a79b45f1a0b90e78383078cdd3",
    "Zarya": "142612a11ad2ca629d2182a51b23d1f2",
    "Zenyatta": "dccc24bfe5d7b09df7b1387d4c8dfba7",
}
Sign up to request clarification or add additional context in comments.

1 Comment

This is a really nice and concise answer that may or may not answer the question. While it does produce a sorted version of the dictionary it is worth noting that it doesn't actually sort the dictionary at the original memory location, so any other references to the mtuable dictionary will remain unsorted. To avoid that (if desired) you would need to then add dct.clear() followed by dct.update(out)
1
data = {
    "top": 590,
    "left": 105, 
    "width": 240, 
    "height": 40,
    "Zarya": "142612a11ad2ca629d2182a51b23d1f2",
    "Kiriko": "4d0528271fd9d0104cd2af0b1c91f4f6",
    "Echo": "175b9c62c57b0d6e18577f352fad4afc",
    "Sojourn": "8ea40548f4472457cfbd46731958a432",
    "Sombra": "319e88daf8a4b53869c6690cd008ebb0",
    "Genji": "b5a7156b9a1921099a884e62f2f7c774",
    "Reaper": "309527687ec1e89f63cfece162c57a66",
    "Ana": "556e9f3ff210729dc9e1cf848c3c579f",
    "Hanzo": "13d164a4f37fd7562b53ede9f5fd2671",
    "Lucio": "d772ddc7e982cd6d714d0a19753c8b32",
    "Torbjorn": "4fdf46b32b3435c714da7a75ba0ccde2",
    "Junkrat": "be29c9729daf9e46606ffa26638641ea",
    "Moira": "0b54634e09e4d108ca248e4e967d15a1",
    "Mei": "90391ff04b11c73e49c48f9b2738d1b0",
    "Dva": "859012ee744e79a630522190ef8ef92c",
    "Soldier 76": "adbd70e889fe6135f372dbd28b7ae5e6",
    "Winston": "1c4245a79b45f1a0b90e78383078cdd3",
    "Tracer": "b5465050c403b020aac35da073d4ab11",
    "Zenyatta": "dccc24bfe5d7b09df7b1387d4c8dfba7",
    "Baptiste": "4d254bc437560ac21780732fc78ffa08",
    "Sigma": "3c85376aee36a901bcbf24b07cf60aa2",
    "Widowmaker": "049092cbd628a54ed22ae5522ca5681c",
    "Orisa": "113acca96744081964854bd94191310a",
    "Ashe": "48ca311fb1b288bb811965e6d84d1786"
}

keys = ['top', 'left', 'width', 'height']

Creating a dictionary with these keys:

data2 = {k: data[k] for k in keys}
# {'left': 105, 'width': 240, 'height': 40, 'top': 590}

Getting all of the other keys:

keys2 = list(data.keys() - list(keys))
# ['Ana', 'Baptiste', 'Zarya', 'Tracer', 'Zenyatta', 'Sigma', 'Dva', 'Torbjorn', 'Mei', 'Orisa', 'Sombra', 'Winston', 'Kiriko', 'Soldier 76', 'Sojourn', 'Ashe', 'Lucio', 'Reaper', 'Moira', 'Widowmaker', 'Junkrat', 'Genji', 'Echo', 'Hanzo']

Sorting those:

keys2.sort()
# ['Ana', 'Ashe', 'Baptiste', 'Dva', 'Echo', 'Genji', 'Hanzo', 'Junkrat', 'Kiriko', 'Lucio', 'Mei', 'Moira', 'Orisa', 'Reaper', 'Sigma', 'Sojourn', 'Soldier 76', 'Sombra', 'Torbjorn', 'Tracer', 'Widowmaker', 'Winston', 'Zarya', 'Zenyatta']

And then updating data2:

data2.update({k: data[k] for k in keys2})
# {'left': 105, 'width': 240, 'height': 40, 'top': 590, 
#  'Ana': '556e9f3ff210729dc9e1cf848c3c579f', 'Ashe': '48ca311fb1b288bb811965e6d84d1786', 'Baptiste': '4d254bc437560ac21780732fc78ffa08', 'Dva': '859012ee744e79a630522190ef8ef92c', 'Echo': '175b9c62c57b0d6e18577f352fad4afc', 'Genji': 'b5a7156b9a1921099a884e62f2f7c774', 'Hanzo': '13d164a4f37fd7562b53ede9f5fd2671', 'Junkrat': 'be29c9729daf9e46606ffa26638641ea', 'Kiriko': '4d0528271fd9d0104cd2af0b1c91f4f6', 'Lucio': 'd772ddc7e982cd6d714d0a19753c8b32', 'Mei': '90391ff04b11c73e49c48f9b2738d1b0', 'Moira': '0b54634e09e4d108ca248e4e967d15a1', 'Orisa': '113acca96744081964854bd94191310a', 'Reaper': '309527687ec1e89f63cfece162c57a66', 'Sigma': '3c85376aee36a901bcbf24b07cf60aa2', 'Sojourn': '8ea40548f4472457cfbd46731958a432', 'Soldier 76': 'adbd70e889fe6135f372dbd28b7ae5e6', 'Sombra': '319e88daf8a4b53869c6690cd008ebb0', 'Torbjorn': '4fdf46b32b3435c714da7a75ba0ccde2', 'Tracer': 'b5465050c403b020aac35da073d4ab11', 'Widowmaker': '049092cbd628a54ed22ae5522ca5681c', 'Winston': '1c4245a79b45f1a0b90e78383078cdd3', 'Zarya': '142612a11ad2ca629d2182a51b23d1f2', 'Zenyatta': 'dccc24bfe5d7b09df7b1387d4c8dfba7'}

Comments

0

Your best hope is to construct a new dictionary by combining two other dictionaries, a sorted one and an unsorted one.

Note that dictionaries are mutable, so in some cases it may be necessary that you actually sort the original dictionary d instead of just replacing it with a new one. This can be done using clear() and then readding the sorted dictionary using update.

Try this runnable example!

#!/usr/bin/env python
d = {
    "top": 590,
    "left": 105,
    "width": 240,
    "height": 40,
    "Zarya": "142612a11ad2ca629d2182a51b23d1f2",
    "Kiriko": "4d0528271fd9d0104cd2af0b1c91f4f6",
    "Echo": "175b9c62c57b0d6e18577f352fad4afc",
    "Sojourn": "8ea40548f4472457cfbd46731958a432",
    "Sombra": "319e88daf8a4b53869c6690cd008ebb0",
    "Genji": "b5a7156b9a1921099a884e62f2f7c774",
    "Reaper": "309527687ec1e89f63cfece162c57a66",
    "Ana": "556e9f3ff210729dc9e1cf848c3c579f",
    "Hanzo": "13d164a4f37fd7562b53ede9f5fd2671",
    "Lucio": "d772ddc7e982cd6d714d0a19753c8b32",
    "Torbjorn": "4fdf46b32b3435c714da7a75ba0ccde2",
    "Junkrat": "be29c9729daf9e46606ffa26638641ea",
    "Moira": "0b54634e09e4d108ca248e4e967d15a1",
    "Mei": "90391ff04b11c73e49c48f9b2738d1b0",
    "Dva": "859012ee744e79a630522190ef8ef92c",
    "Soldier 76": "adbd70e889fe6135f372dbd28b7ae5e6",
    "Winston": "1c4245a79b45f1a0b90e78383078cdd3",
    "Tracer": "b5465050c403b020aac35da073d4ab11",
    "Zenyatta": "dccc24bfe5d7b09df7b1387d4c8dfba7",
    "Baptiste": "4d254bc437560ac21780732fc78ffa08",
    "Sigma": "3c85376aee36a901bcbf24b07cf60aa2",
    "Widowmaker": "049092cbd628a54ed22ae5522ca5681c",
    "Orisa": "113acca96744081964854bd94191310a",
    "Ashe": "48ca311fb1b288bb811965e6d84d1786"
}

# first use a dictionary comprehension to construct a dictionary from only the first four keys
unsorted_part = {k: v for i, (k, v) in enumerate(d.items()) if i < 4}

# now make a dictionary of the sorted second half
items_to_sort = list(d.items())[4:]
sorted_part = dict(sorted(items_to_sort))

# now make a sorted dictionary
new_d = {**unsorted_part, **sorted_part}

# NOTE: if you don't have other references to d that you need to update implicitly as well,
# you could do d={**unsorted_part, **sorted_part}
# HOWEVER: if you do have other references to the original dictionary that you want sorted (i.e. d_ref2)
# you need to clear the original dictionary and re-add all the keys/values in the new order
d_ref2 = d
d.clear()
d.update(new_d)

# now print it out
import json
print(json.dumps(d, indent=2))
<script src="https://modularizer.github.io/pyprez/pyprez.min.js"></script>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.