python - 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"}}
解决方案
您可以通过为数据中的每个条目建立一些价值概念来实现这一点。例如,我在以下函数中定义了数据条目的“值”,但请注意,它严重依赖于在第二个嵌套 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])
将产生相同的输出,但要小心并注意它不会考虑第一级键(数字)的值,并且会按字典顺序对时间进行排序。
推荐阅读
- jquery - 选中时禁用动态创建的复选框
- android - 数据绑定在android中是如何工作的?
- azure - 无法通过 Windows 应用程序读取 Azure Key Vault 的密钥
- asp.net - 使用 IIS 8 和 VB.Net 进行路由时出现错误 404
- python-3.x - 最常出现的邻居 (nltk)
- reactjs - eslint 不对不存在的类方法发出警告
- javascript - Hyperapp中输入元素的输入事件的去抖动动作
- react-native - React Native 中的 Redux Persist 和 Update Packager
- ansible - Ansible 无法安装 Windows INF 驱动程序
- javascript - 重新加载页面后 Ajax 值保持不变