簡體   English   中英

基於字母數字值的鍵對python字典進行排序

[英]Sorting python dictionary based on keys which is alphanumeric values

我是 python 新手。 在 Python 中,我想首先根據“年份”鍵對字典項列表進行排序,然后使用字母數字鍵,即 P1、P2、P3。

代碼片段如下:

[
    {"P9": 0, "year": 2023},
    {"P13": 0, "year": 2023},
    {"P10": 0, "year": 2023},
    {"P11": 121200, "year": 2022},
    {"P12": 0, "year": 2023},
]

哪個首先按年份升序排序變為:

[
    {"P11": 121200, "year": 2022},
    {"P9": 0, "year": 2023},
    {"P13": 0, "year": 2023},
    {"P10": 0, "year": 2023},
    {"P12": 0, "year": 2023},
]

稍后再按句點鍵排序,即 P1、P2、P3 等變為:

[
    {"P11": 121200, "year": 2022},
    {"P9": 0, "year": 2023},
    {"P10": 0, "year": 2023},
    {"P12": 0, "year": 2023},
    {"P13": 0, "year": 2023},
]

以上是預期的輸出,現在我不知道我該如何排序

排序功能滿足您的所有需求

您可以傳遞一個關鍵函數(可調用)來識別正確的順序。 在你的情況下:

unordered = [{'P9': 0, 'year': 2023}, {'P13': 0, 'year': 2023}, {'P10': 0, 'year': 2023}, {'P11': 121200, 'year': 2022}, {'P12': 0, 'year': 2023}]

#by year

sorted(unordered, key=lambda x: x['year'])
# out
[{'P11': 121200, 'year': 2022},
 {'P9': 0, 'year': 2023},
 {'P13': 0, 'year': 2023},
 {'P10': 0, 'year': 2023},
 {'P12': 0, 'year': 2023}]

對於期間,解決方案有點棘手,您必須確定如何選擇 P** 鍵。 我們不知道這些字典是如何構建的,但做一些假設可能是這樣的:

sorted(unordered, key=lambda x: [lbl for lbl in x if lbl.startswith('P')][0] )

但這里缺乏更准確的信息

您可以使用 sorted 函數,並使用它指定一個鍵函數。 但是由於您想使用兩個單獨的數據點作為鍵,您可以使用元組來構建一個鍵。

因為當比較元組時,它首先比較其中的第一個實體,如果第一個匹配,那么它會檢查第二個實體。

例子:

>>> (1,3) > (1, 4)
False

>>> (1, 4) < (2,2)
True

>>> (1, 4, 1) < (2, 1)
True

因此,以下是構建關鍵功能的方法:

>>> unordered = [{'P9': 0, 'year': 2023}, {'P13': 0, 'year': 2023}, {'P10': 0, 'year': 2023}, {'P11': 121200, 'year': 2022}, {'P12': 0, 'year': 2023}]
>>> ordered = sorted(
    unordered,
    key=lambda d: (d['year'], next(int(k[1:]) for k in d.keys() if k.startswith('P')))
)

>>> ordered
[{'P11': 121200, 'year': 2022}, {'P9': 0, 'year': 2023}, {'P10': 0, 'year': 2023}, {'P12': 0, 'year': 2023}, {'P13': 0, 'year': 2023}]

在這里,我只是假設您在字典中總是有一個以P開頭的鍵,並且它的其余部分是一個整數。

要對第一個基years進行排序,然后對每個dict的基第一個鍵進行排序,您可以捕獲數字並轉換為int ,然后進行如下排序:

>>> sorted(lst_dct, key=lambda x: (x['year'], int(list(x.keys())[0][1:])))
[{'P11': 121200, 'year': 2022},
 {'P9': 0, 'year': 2023},
 {'P10': 0, 'year': 2023},
 {'P12': 0, 'year': 2023},
 {'P13': 0, 'year': 2023}]

暫無
暫無

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

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