首页 > 解决方案 > Python排序嵌套字典

问题描述

我想对这个嵌套字典进行两次排序。首先,我想按时间排序,然后按key。这是一个嵌套的嵌套字典。时间应先过滤,然后通过内部字典的键(“FileNameXXX”)过滤。

data = {1: {"05:00:00": {"FileName123": "LineString1"}},
        2: {"16:00:00": {"FileName456": "LineString2"}},
        3: {"07:00:00": {"FileName789": "LineString3"}},
        4: {"07:00:00": {"FileName555": "LineString4"}}}

预期结果:

1: {"05:00:00": {"FileName123": "LineString1"}}
3: {"07:00:00": {"FileName789": "LineString3"}}
4: {"07:00:00": {"FileName555": "LineString4"}}
2: {"16:00:00": {"FileName456": "LineString2"}}

标签: pythondictionary

解决方案


您可以通过为数据中的每个条目建立一些价值概念来实现这一点。例如,我在以下函数中定义了数据条目的“值”,但请注意,它严重依赖于在第二个嵌套 dict 中恰好有一个键,该键也必须是严格格式化为字符串的时间。

def get_comparable(key):
    raw_time = list(data[key].keys())[0]
    time = datetime.strptime(raw_time, "%H:%M:%S").time()
    return time.hour * 3600 + time.minute * 60 + time.second + key * 0.001

你可以使用:

for k in sorted(data, key=get_comparable):
    print(k, data[k])

输出:

1 {'05:00:00': {'FileName123': 'LineString1'}}
3 {'07:00:00': {'FileName789': 'LineString3'}}
4 {'07:00:00': {'FileName555': 'LineString4'}}
2 {'16:00:00': {'FileName456': 'LineString2'}}

使用

sorted(data, key=lambda x: list(data[x].keys())[0])

将产生相同的输出,但要小心并注意它不会考虑第一级键(数字)的值,并且会按字典顺序对时间进行排序。


推荐阅读