Python сортирует json после n элементов

У меня есть json/dict в следующем формате:

{
    "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"
}

Я хотел бы отсортировать все после top, left, width, height по алфавиту по ключу, при этом оставив первые 4 ключа в начале. Как я могу это сделать?

Используйте текстовый редактор, например Sublime или Notepad++.

MattDMo 02.11.2022 02:14

Вы хотите отсортировать объект словаря в памяти или файл json на диске?

John Gordon 02.11.2022 02:18

@JohnGordon не будет ли разница между тем, кто просто читает/записывает отсортированный диктофон в файл json?

Nicholas Hansen-Feruch 02.11.2022 02:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Предполагая, что вы используете Python 3.7+, вы можете использовать (dct ваш словарь из вопроса):

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

Отпечатки:

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

Это действительно хороший и краткий ответ, который может отвечать или не отвечать на вопрос. Хотя он создает отсортированную версию словаря, стоит отметить, что он фактически не сортирует словарь в исходной ячейке памяти, поэтому любые другие ссылки на изменяемый словарь останутся несортированными. Чтобы избежать этого (при желании), вам нужно будет добавить dct.clear(), а затем dct.update(out)

Modularizer 02.11.2022 02:38
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']

Создание словаря с этими ключами:

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

Получение всех остальных ключей:

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

Сортировка тех:

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

А затем обновление 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'}

Ваша лучшая надежда состоит в том, чтобы создать новый словарь, объединив два других словаря, отсортированный и несортированный.

Обратите внимание, что словари изменяемы, поэтому в некоторых случаях может потребоваться сортировка исходного словаря d вместо того, чтобы просто заменить его новым. Это можно сделать с помощью clear(), а затем прочитать отсортированный словарь с помощью update.

Попробуйте этот работающий пример!

#!/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>

Другие вопросы по теме