根据键对字典列表进行排序

时间:2016-07-28 18:23:20

标签: python dictionary

我想根据键的存在对字典列表进行排序。假设我有一个键列表[key2,key3,key1],我需要以这样的方式对列表进行排序:带有key2的字典应该先出现,key3应该出现在第二个,而key1应该是最后一个。

我看到了这个答案(Sort python list of dictionaries by key if key exists),但它只引用了一个键

排序不是基于'key'的值。它取决于密钥的存在,也取决于预定义的密钥列表。

3 个答案:

答案 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作为它们的键排序键,以便将它们排序到最后。