我有一个简单的字典和一个列表,我想按字典中的值进行排序。
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
但无法给出答案。
答案 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'}