Сортировать словарь по значениям его значений - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть JSON, который выглядит следующим образом:

{
    "Chile": {
        "num_of_unique_ips": 1,
        "num_of_unique_asns": 1,
        "asns": {
            "AS16629 CTC. CORP S.A. (TELEFONICA EMPRESAS)": 1
        }
    },
    "China": {
        "num_of_unique_ips": 1,
        "num_of_unique_asns": 1,
        "asns": {
            "AS4808 China Unicom Beijing Province Network": 1
        }
    }, # this goes on and on for ever country
}

Я преобразовал его в словарь, запустив:

import json
login_by_country = json.loads(open('login_by_country.json', 'r'))

Как мне отсортировать этот словарь по значению num_of_unique_ips в каждой стране?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2019
sorted(login_by_country.items(), key=lambda it: it[1]['num_of_unique_ips'])

Это вернет список пар (страна, values_dict).Вы можете преобразовать его обратно в словарь, сохраняя отсортированный порядок, передав его OrderedDict, или обычному dict, если вы используете версию Python, которая гарантирует точный порядок (cpython 3.6+ или pypy 2.5).

0 голосов
/ 20 апреля 2019

Как сказал @johrsharpe в комментарии - словарь не должен поддерживать порядок (но, вероятно, они будут поддерживаться в новейшем Python).

Вы можете создать список с парами (num_of_unique_ips , country), а затем легкоотсортировать и сохранить в порядке.

logins_by_country = {
    "Chile": {
        "num_of_unique_ips": 1,
        "num_of_unique_asns": 1,
        "asns": {
            "AS16629 CTC. CORP S.A. (TELEFONICA EMPRESAS)": 1
        }
    },
    "China": {
        "num_of_unique_ips": 1,
        "num_of_unique_asns": 1,
        "asns": {
            "AS4808 China Unicom Beijing Province Network": 1
        }
    }, # thi
}

data = [(val["num_of_unique_ips"], key) for key, val in logins_by_country.items()]

order = sorted(data) 

print(order)

Результат.Сортирует по num_of_unique_ips и country (если у них есть sam num_of_unique_ips)

[(1, 'Chile'), (1, 'China')]

, и теперь вы можете использовать его для получения данных из словаря в ожидаемом порядке.

for number, country in order:
    print(logins_by_country[country])

Вы также можете использовать его для создания OrderedDict, который будет поддерживать порядок

from collections import OrderedDict

new_dict = OrderedDict()

for number, country in order:
    new_dict[country] = logins_by_country[country]

print(new_dict)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...