Как поменять порядок вложенных словарей в python3? - PullRequest
0 голосов
/ 11 февраля 2019

Извините, если подобный вопрос уже задавался, хотя я не смог найти ответы после всестороннего поиска в Google.Я боролся с экспортом следующего словаря в файл JSON с ключами, упорядоченными в порядке убывания.Файл должен быть доступен для чтения вне Python, поэтому pickle не может быть использован.

Я использую Python3.7, и я пытался использовать библиотеки simplejson и json, чтобы выгрузить вложенный dict в файл json,хотя были неудачными.Pickle, похоже, работал, хотя он экспортирует двоичный файл, который не читается за пределами Python.Dict называется «существующим».

with open('Entries_2.json', 'w') as outfile:
    simplejson.dump(existing,outfile,item_sort_key=simplejson.simple_first)
outfile.close()

with open('Entries.json', 'w') as outfile:
    json.dump(existing, outfile, sort_keys=True, indent=4)
outfile.close()

Оба вышеуказанных метода дают одинаковый результат:

{
    "Entries": {
        "2019/01/23": {
            "Result-9595905890": {
                "count": 4,
                "time": "2019/01/23 03:32:32"
            }
        },
        "2019/01/24": {
            "Result-9607169713": {
                "count": 21,
                "time": "2019/01/24 03:31:34"
            },
            "Result-9611777668": {
                "count": 23,
                "time": "2019/01/24 12:58:49"
            }
        },
        "2019/01/25": {
            "Result-9618433556": {
                "count": 21,
                "time": "2019/01/25 03:31:27"
            }
        }
    }
}

Хотя параметр reverse = True не работает ни в одном из параметров дампа.Что мне нужно:

{
    "Entries": {
        "2019/01/25": {
            "Result-9618433556": {
                "count": 21,
                "time": "2019/01/25 03:31:27"
            }
        },
        "2019/01/24": {
            "Result-9607169713": {
                "count": 21,
                "time": "2019/01/24 03:31:34"
            },
            "Result-9611777668": {
                "count": 23,
                "time": "2019/01/24 12:58:49"
            }
        },
        "2019/01/23": {
            "Result-9595905890": {
                "count": 4,
                "time": "2019/01/23 03:32:32"
            }
        }
    }
}

Кто-нибудь сталкивался с подобной борьбой?

1 Ответ

0 голосов
/ 11 февраля 2019

Попробуйте посмотреть collection.OrderedDict

import json, collections

existing = {
    "Entries": {
        "2019/01/23": {
            "Result-9595905890": {
                "count": 4,
                "time": "2019/01/23 03:32:32"
            }
        },
        "2019/01/24": {
            "Result-9607169713": {
                "count": 21,
                "time": "2019/01/24 03:31:34"
            },
            "Result-9611777668": {
                "count": 23,
                "time": "2019/01/24 12:58:49"
            }
        },
        "2019/01/25": {
            "Result-9618433556": {
                "count": 21,
                "time": "2019/01/25 03:31:27"
            }
        }
    }
}

new_entries = collections.OrderedDict(reversed(sorted(existing['Entries'].items()))) # if you want reversed sorted
existing['Entries'] = new_entries

with open('Entries.json', 'w') as outfile:
    json.dump(existing, outfile, indent=4)

Кстати, когда вы выполните with open('Entries.json', 'w') as outfile:, оно автоматически закроет выходной файл после завершения оператора with, поэтому вам не нужночтобы явно закрыть его.

Вывод:

{
    "Entries": {
        "2019/01/25": {
            "Result-9618433556": {
                "count": 21,
                "time": "2019/01/25 03:31:27"
            }
        },
        "2019/01/24": {
            "Result-9607169713": {
                "count": 21,
                "time": "2019/01/24 03:31:34"
            },
            "Result-9611777668": {
                "count": 23,
                "time": "2019/01/24 12:58:49"
            }
        },
        "2019/01/23": {
            "Result-9595905890": {
                "count": 4,
                "time": "2019/01/23 03:32:32"
            }
        }
    }
}
...