簡體   English   中英

Pythonic以棘手的順序對字典列表進行排序

[英]Pythonic sort a list of dictionaries in a tricky order

我有一個id列表,在適當的oder中排序:

ids = [1, 2, 4, 6, 5, 0, 3]

我還有一個字典列表,以一些隨機的方式排序:

rez = [{'val': 7, 'id': 1}, {'val': 8, 'id': 2}, {'val': 2, 'id': 3}, {'val': 0, 'id': 4}, {'val': -1, 'id': 5}, {'val': -4, 'id': 6}, {'val': 9, 'id': 0}]

我的意圖是以對應於ids的方式對rez列表進行排序:

rez = [{'val': 7, 'id': 1}, {'val': 8, 'id': 2}, {'val': 0, 'id': 4}, {'val': -4, 'id': 6}, {'val': -1, 'id': 5}, {'val': 9, 'id': 0}, {'val': 2, 'id': 3}]

我試過了:

rez.sort(key = lambda x: ids.index(x['id']))

然而這種方式對我來說太慢了,因為len(ids)> 150K,並且每個dict實際上有很多鍵(一些值有字符串)。 任何建議如何以最pythonic,但仍然最快的方式做到這一點?

您不需要sort因為ids指定結果的整個順序。 您只需要通過其ID選擇正確的元素:

rez_dict = {d['id']:d for d in rez}
rez_ordered = [rez_dict[id] for id in ids]

這使:

>>> rez_ordered
[{'id': 1, 'val': 7}, {'id': 2, 'val': 8}, {'id': 4, 'val': 0}, {'id': 6, 'val': -4}, {'id': 5, 'val': -1}, {'id': 0, 'val': 9}, {'id': 3, 'val': 2}]

這應該比排序更快,因為它可以平均在線性時間內完成,而排序是O(nlogn)。

請注意,這假設每個id將有一個條目,如您的示例所示。

我認為你走在正確的軌道上。 如果你需要加快速度,因為你的列表太長並且你有二次復雜性,你可以先將列表轉換為字典,然后將id映射到各自的索引。

indices = {id_: pos for pos, id_ in enumerate(ids)}
rez.sort(key = lambda x: indices[x['id']])

這樣, indices{0: 5, 1: 0, 2: 1, 3: 6, 4: 2, 5: 4, 6: 3} rez {0: 5, 1: 0, 2: 1, 3: 6, 4: 2, 5: 4, 6: 3} ,並且rez

[{'id': 1, 'val': 7}, 
 {'id': 2, 'val': 8}, 
 {'id': 4, 'val': 0}, 
 {'id': 6, 'val': -4}, 
 {'id': 5, 'val': -1}, 
 {'id': 0, 'val': 9}, 
 {'id': 3, 'val': 2}]

暫無
暫無

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

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