我必須像這樣對字典進行排序:
jobs = {'elem_05': {'id': 'fifth'},
'elem_03': {'id': 'third'},
'elem_01': {'id': 'first'},
'elem_00': {'id': 'zeroth'},
'elem_04': {'id': 'fourth'},
'elem_02': {'id': 'second'}}
基于“id”元素,其順序可以在串列中找到:
sorting_list = ['zeroth', 'first', 'second', 'third', 'fourth', 'fifth']
執行此操作的簡單方法是使用:
tmp = {}
for x in sorting_list:
for k, v in jobs.items():
if v["id"] == x:
tmp.update({k: v})
但我試圖找出一種更有效和更pythonic的方式來做到這一點。我一直在嘗試將 sorted 和 lambda 函式作為 key,但我還不熟悉,所以到目前為止我還沒有成功。
uj5u.com熱心網友回復:
有一種方法可以使用 lambda 作為排序鍵對 dict 進行排序:
jobs = {'elem_05': {'id': 'fifth'},
'elem_03': {'id': 'third'},
'elem_01': {'id': 'first'},
'elem_00': {'id': 'zeroth'},
'elem_04': {'id': 'fourth'},
'elem_02': {'id': 'second'}}
sorting_list = ['zeroth', 'first', 'second', 'third', 'fourth', 'fifth']
sorted_jobs = dict(sorted(jobs.items(), key=lambda x: sorting_list.index(x[1]['id'])))
print(sorted_jobs)
這輸出
{'elem_00': {'id': 'zeroth'}, 'elem_01': {'id': 'first'}, 'elem_02': {'id': 'second'}, 'elem_03': {'id': 'third'}, 'elem_04': {'id': 'fourth'}, 'elem_05': {'id': 'fifth'}}
我有一種感覺,sorted表達可以更干凈,但我沒有讓它以任何其他方式作業。
uj5u.com熱心網友回復:
您可以使用OrderedDict:
from collections import OrderedDict
sorted_jobs = OrderedDict([(el, jobs[key]['id']) for el, key in zip(sorting_list, jobs.keys())])
這將創建一個OrderedDict與 非常相似的物件dict,并且可以轉換為dictusing dict(sorted_jobs)。
uj5u.com熱心網友回復:
類似于已經發布的內容,但有錯誤檢查以防萬一id沒有出現sorting_list
sorting_list = ['zeroth', 'first', 'second', 'third', 'fourth', 'fifth']
jobs = {'elem_05': {'id': 'fifth'},
'elem_03': {'id': 'third'},
'elem_01': {'id': 'first'},
'elem_00': {'id': 'zeroth'},
'elem_04': {'id': 'fourth'},
'elem_02': {'id': 'second'}}
def custom_order(item):
try:
return sorting_list.index(item[1]["id"])
except ValueError:
return len(sorting_list)
jobs_sorted = {k: v for k, v in sorted(jobs.items(), key=custom_order)}
print(jobs_sorted)
uj5u.com熱心網友回復:
我會使用字典作為鍵sorted:
order = {k:i for i,k in enumerate(sorting_list)}
# {'zeroth': 0, 'first': 1, 'second': 2, 'third': 3, 'fourth': 4, 'fifth': 5}
out = dict(sorted(jobs.items(), key=lambda x: order.get(x[1].get('id'))))
輸出:
{'elem_00': {'id': 'zeroth'},
'elem_01': {'id': 'first'},
'elem_02': {'id': 'second'},
'elem_03': {'id': 'third'},
'elem_04': {'id': 'fourth'},
'elem_05': {'id': 'fifth'}}
uj5u.com熱心網友回復:
該sorted函式的平均時間復雜度為O(n log n)。對于線性時間復雜度,您可以創建一個反向映射,將每個 ID 映射到相應的 dict 條目:
mapping = {d['id']: (k, d) for k, d in jobs.items()}
這樣您就可以通過sorting_list使用上面的 ID 映射來構造一個新的字典:
dict(map(mapping.get, sorting_list))
使用您的示例輸入,回傳:
{'elem_00': {'id': 'zeroth'}, 'elem_01': {'id': 'first'}, 'elem_02': {'id': 'second'}, 'elem_03': {'id': 'third'}, 'elem_04': {'id': 'fourth'}, 'elem_05': {'id': 'fifth'}}
演示:https ://replit.com/@blhsing/WorseChartreuseFonts
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/514020.html
標籤:Python排序字典
