我想根据键的存在对字典列表进行排序。假设我有一个键列表[key2,key3,key1],我需要以这样的方式对列表进行排序:带有key2的字典应该先出现,key3应该出现在第二个,而key1应该是最后一个。
我看到了这个答案(Sort python list of dictionaries by key if key exists),但它只引用了一个键
排序不是基于'key'的值。它取决于密钥的存在,也取决于预定义的密钥列表。
答案 0 :(得分:1)
使用sorted
之类的列表作为排序依据,使用[key1 in dict, key2 in dict, ...]
。请记住反转结果,因为True
(即密钥在dict中)在False
之后排序。
>>> dicts = [{1:2, 3:4}, {3:4}, {5:6, 7:8}]
>>> keys = [5, 3, 1]
>>> sorted(dicts, key=lambda d: [k in d for k in keys], reverse=True)
[{5: 6, 7: 8}, {1: 2, 3: 4}, {3: 4}]
这是使用所有键断开关系,例如在上面的例子中,有两个词组具有键3
,但其中一个也有键1
,所以这个排序第二。
答案 1 :(得分:0)
这样的事情
def sort_key(dict_item, sort_list):
key_idx = [sort_list.index(key) for key in dict_item.iterkeys() if key in sort_list]
if not key_idx:
return len(sort_list)
return min(key_idx)
dict_list.sort(key=lambda x: sort_key(x, sort_list))
如果列表中的给定字典包含排序列表中的多个键,则它将使用索引最低的字典。如果排序列表中没有任何键,则将字典发送到列表的末尾。
包含相同“最佳”键(即最低索引)的词典在顺序方面被认为是相等的。如果这是一个问题,那么让sort_key
函数考虑所有键而不是最好的键就不会太难。
要做到这一点,只需返回整个key_idx
而不是min(key_idx)
而不是len(sort_list)
返回[len(sort_list)]
答案 2 :(得分:0)
我会这样做:
sorted_list = sorted(dict_list, key = lambda d: next((i for (i, k) in enumerate(key_list) if k in d), len(key_list) + 1))
使用生成器表达式在每个字典中的第一个键的键列表中查找索引,然后使用该值作为排序键,其中包含的任何键都不包含len(key_list) + 1
作为它们的键排序键,以便将它们排序到最后。