根据值对字典进行自定义排序

时间:2020-01-13 14:22:28

标签: python sorting dictionary

我有一个简单的字典和一个列表,我想按字典中的值进行排序。

data_dict = {'foo' : 'one', 'bar' : 'two', 'foobar' : 'three', 'notinsort' : 'four'}

custom_sort = ['three','one','two'] 

我自己的尝试是使用字典理解和自定义键进行排序:

{k:v for k,v in sorted(data_dict.items(), key=lambda i : custom_sort.index(i[1]) )}

将正确返回ValueError: 'four' is not in list

没问题,我可以在lambda中使用if-else语句将其过滤掉吗?因为我仍然希望值首先按照我的自定义排序进行排序,所以自然排序就可以了。

{
    k: v
    for k, v in sorted(
        data_dict.items(),
        key=lambda i: custom_sort.index(i[1])
        if [k for k in data_dict.values() if k in custom_sort] 
        else sorted(data_dict.items()),
    )
}

这将返回相同的ValueError,我为此尝试的任何变体最终都会给我一种自然的排序方式,而忽略了我的自定义键。

我从上面的输入中获得的期望输出是:

data_dict = {'foobar' : 'three', 'foo' : 'one', 'bar' : 'two', 'notinsort' : 'four'}

我有以下问题:

How do I sort a dictionary by value?Custom Sorting Python Dictionary

但无法给出答案。

1 个答案:

答案 0 :(得分:4)

您可以改为预先为查找定义字典(将复杂度降低到O(n log n),因为字典查找为O(1))。这适用于Python 3.6>,其中保留字典的顺序:

d = {v:k for k,v in enumerate(custom_sort)}
# {'three': 0, 'one': 1, 'two': 2}
dict(sorted(data_dict.items(), key=lambda x: d.get(x[1], float('inf'))))
# {'foobar': 'three', 'foo': 'one', 'bar': 'two', 'notinsort': 'four'}