![](/img/trans.png)
[英]Sort a list of dictionaries by a key, based on the order of keys in a separate list in Python
[英]sort a list of dictionaries based on explicitly defined order of keys
我有一個字典列表,例如:
names = [{'Mark':'Volvo'}, {'John':'BMW'}, {'Eliza':'Merci'}, {'Calen':'Audi'}]
我想通過字典的鍵名設置顯式排序。
例如,如果我發出這個命令:
['John','Mark','Calen','Eliza']
預期的 output 將是:
[{'John':'BMW'},{'Mark':'Volvo'},{'Calen':'Audi'},{'Eliza':'Merci'}]
我想添加一個自定義邏輯順序。 根據我如何定義他們的名字的順序,通過模板顯示他們的名字。
類似於有沒有辦法通過“謂詞”列表對字符串列表進行排序? :由於names
是一個字典列表,每個字典只有一個鍵值對,所以使用order
列表中人名的index
作為排序的鍵:
>>> names = [{'Mark': 'Volvo'}, {'John': 'BMW'}, {'Eliza': 'Merci'}, {'Calen' :'Audi'}]
>>> order = ['John', 'Mark', 'Calen', 'Eliza']
>>>
>>> # with `sorted()`
>>> sorted(names, key=lambda d: order.index(list(d.keys())[0]))
[{'John': 'BMW'}, {'Mark': 'Volvo'}, {'Calen': 'Audi'}, {'Eliza': 'Merci'}]
>>>
>>> # or with `list.sort()`
>>> names.sort(key=lambda d: order.index(list(d.keys())[0]))
>>> names
[{'John': 'BMW'}, {'Mark': 'Volvo'}, {'Calen': 'Audi'}, {'Eliza': 'Merci'}]
dict.keys()
不是不可下標的,所以dict.keys()[0]
不起作用。 因此,首先將其轉換為列表,然后使用其唯一鍵list(dict.keys())[0]
。 這將給出“Mark”、“John”等。然后在order
列表中獲取該人姓名的索引。 注意:如果一個人沒有按order
列出,它將失敗。
即使names
是一個包含多個鍵值對的字典列表,只要人名是第一個鍵,它仍然可以從 Python 3.7/3.6 開始工作。 請參閱此項目下方的注釋:
在 3.7 版更改:字典順序保證為插入順序。 這種行為是 CPython 3.6 的實現細節。
>>> names = [{'Mark': 'Volvo', 'age': 30},
... {'John': 'BMW', 'age': 40},
... {'Eliza': 'Merci', 'age': 50},
... {'Calen': 'Audi', 'age': 60}]
>>> sorted(names, key=lambda d: order.index(list(d.keys())[0]))
[{'John': 'BMW', 'age': 40}, {'Mark': 'Volvo', 'age': 30}, {'Calen': 'Audi', 'age': 60}, {'Eliza': 'Merci', 'age': 50}]
>>>
首先,如果您的字典只有一個條目,元組似乎是此數據的更好選擇:
>>> names = [('Mark', 'Volvo'), ('John', 'BMW'), ('Eliza', 'Merci'), ('Calen', 'Audi')]
現在,給定這個命令:
>>> order = ['John', 'Mark', 'Calen', 'Eliza']
您可以創建一個將名稱映射到索引的字典:
>>> order_map = { k: v for v, k in enumerate(order) }
>>> order_map
{'John': 0, 'Mark': 1, 'Calen': 2, 'Eliza': 3}
並在鍵 function 中使用它進行排序:
>>> names.sort(key=lambda v: order_map[v[0]])
>>> names
[('John', 'BMW'), ('Mark', 'Volvo'), ('Calen', 'Audi'), ('Eliza', 'Merci')]
names = [{'Mark':'Volvo'}, {'John':'BMW'}, {'Eliza':'Merci'}, {'Calen':'Audi'}]
ordered_keys = ['John','Mark','Calen','Eliza']
sorted_names = [name for key in ordered_keys for name in names if key in name]
它按順序遍歷ordered_keys 並提取dict 列表中具有該鍵的任何名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.