簡體   English   中英

根據明確定義的鍵順序對字典列表進行排序

[英]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.

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