簡體   English   中英

按字典的值對字典排序

[英]Sort a dictionary by its values' values

我目前有一些看起來像這樣的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值對字典進行排序?

sorted(login_by_country.items(), key=lambda it: it[1]['num_of_unique_ips'])

這將返回(country,values_dict)對的列表。 你可以把它轉換回字典,同時將它傳遞給保持的排序順序OrderedDict ,或定期dict ,如果您使用的是Python版本,其保證了字典排序(CPython的3.6+或pypy 2.5)。

正如@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_ipscountry (如果他們有sam num_of_unique_ipsnum_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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM