![](/img/trans.png)
[英]Sorting python dictionary based on keys which contains alphanumeric value
[英]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.