簡體   English   中英

根據自定義順序對字典列表進行排序

[英]Sort list of dictionaries according to custom ordering

我需要根據預定義的值列表對字典列表進行排序

我正在使用這部分代碼,它可以正常工作,但 l_of_dicts 的值不在 sort_l(預定義的值列表)中

l_of_dicts = [{'name':'Max','years':18},{'name':'John','years':25},{'name':'Ana','years':19},{'name':'Melis','years':38},{'name':'Ivana','years':38}]

sort_l = ['Ana','Melis','John','Max','Peter']

res = sorted(l_of_dicts , key = lambda ele: sort_l .index(list(ele.values())[0]))

我得到一個錯誤:

ValueError: 'Ivana' is not in list

是否可以忽略該值? 甚至更好地將它們提取到另一個列表?


下面的腳本完成了這項工作,但看起來比應有的重。 也許有更簡單的方法來做到這一點。

腳本:

def sort_dict_list(dict_list, sorting_list):
    result = []
    not_used_values = []
    temp = {}
    for index, dictionary in enumerate(dict_list):
        temp[dictionary['name']] = index
    for item in sorting_list:
        if item in temp.keys():
            result.append(dict_list[temp[item]])
        else:
            not_used_values.append(item)
    return result, not_used_values

您可以進行一些預處理以將僅名稱的順序存儲在l_of_dicts中:

l_of_dicts = [{'name': 'Max', 'years': 18}, {'name': 'John', 'years': 25},
              {'name': 'Ana', 'years': 19}, {'name': 'Melis', 'years': 38}]
names_in_dicts = {d['name'] for d in l_of_dicts if 'name' in d}
sort_l = ['Ana', 'Melis', 'Ivana', 'John', 'Max', 'Peter']
sort_order = {name: order for order, name in enumerate(sort_l) if name in
              names_in_dicts}
print(sort_order)  # {'Ana': 0, 'Melis': 1, 'John': 3, 'Max': 4}
sorted_l_of_dicts = sorted(l_of_dicts, key=lambda d: sort_order[d['name']])
print(sorted_l_of_dicts)  # [{'name': 'Ana', 'years': 19}, {'name': 'Melis', 'years': 38}, {'name': 'John', 'years': 25}, {'name': 'Max', 'years': 18}]

暫無
暫無

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

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