[英]Sort subdictionary lists by their dictionary's key values
我有一个XML文件(约500行),该文件在Python中转换为嵌套的有序字典。 我需要根据值对它进行排序,但是由于它嵌套太多,并且其中包含列表,所以我迷路了。 我一直在寻找答案,试图找到一种对与列表混合的字典进行排序的方法。 但到目前为止没有运气。
这是我最接近的。 Python:按值对嵌套字典进行排序但是,由于我有一个包含2个子键“ foo”和“ bar”的键,这些子键具有列表,而列表本身内部也有字典,所以这并不是我所需要的。
我想根据“日期”对“ foo”和“ bar”进行排序。 或按“日期”值返回子目录。
我有一个循环,遍历子词典的列表,但是没有对它进行排序。 我曾尝试更改它以修复它,但没有任何更改。 那也无济于事,lambda在我看来像魔术。
for i in range(len(your_dict['History']['foo'])):
mine = OrderedDict(sorted(your_dict.items(), key=lambda x: x[1]["foo"][i]['Date']))
字典的简短示例:
"History": {
"@version": "4.0",
"foo": [
{"code": "ID", "Date": "2018-07-09T15:31:09+03:00"},
{"Date": "2018-07-09T13:46:09+03:00"}
],
"bar": [
{"code": "ID", "Date": "2018-07-09T09:39:29+03:00"},
{"code": "ID", "Date": "2018-07-09T09:48:25+03:00"}
]
}
那么如何对“ foo”和“ bar”进行排序?
使用lambda
sorted
例如:
d = {"History": {
"@version": "4.0",
"foo": [
{"code": "ID", "Date": "2018-07-09T15:31:09+03:00"},
{"Date": "2018-07-09T13:46:09+03:00"}
],
"bar": [
{"code": "ID", "Date": "2018-07-09T09:39:29+03:00"},
{"code": "ID", "Date": "2018-07-09T09:48:25+03:00"}
]
}
}
print(sorted(d["History"]["foo"], key=lambda k: k['Date']))
print(sorted(d["History"]["bar"], key=lambda k: k['Date']))
输出:
[{'Date': '2018-07-09T13:46:09+03:00'}, {'Date': '2018-07-09T15:31:09+03:00', 'code': 'ID'}]
[{'Date': '2018-07-09T09:39:29+03:00', 'code': 'ID'}, {'Date': '2018-07-09T09:48:25+03:00', 'code': 'ID'}]
问题是您试图获取.items,而您只想对列表进行排序,因此不需要所有这些东西,就可以像这样简单地将其获取:
for i in ('foo', 'bar'):
your_dict['History'][i] = sorted(your_dict['History][i], key=lambda x:x['date'])
>>> s = dict((k,sorted(v, key=lambda x: x['Date'])) for k,v in d['History'].items() if type(v)==list)
>>> s['foo']
[{'Date': '2018-07-09T13:46:09+03:00'}, {'code': 'ID', 'Date': '2018-07-09T15:31:09+03:00'}]
>>> s['bar']
[{'code': 'ID', 'Date': '2018-07-09T09:39:29+03:00'}, {'code': 'ID', 'Date': '2018-07-09T09:48:25+03:00'}]
说明以下列表推导会将dict项目作为键值对返回
[(k,v) for k,v in d['History'].items()]
这将过滤键值对,并仅在value为list类型时才包括它们
[(k,v) for k,v in d['History'].items() if type(v)==list]
# [('foo', [{'code': 'ID', 'Date': '2018-07-09T15:31:09+03:00'}, {'Date': '2018-07-09T13:46:09+03:00'}]), ('bar', [{'code': 'ID', 'Date': '2018-07-09T09:39:29+03:00'}, {'code': 'ID', 'Date': '2018-07-09T09:48:25+03:00'}])]
我们现在要做的就是根据日期对每个值进行排序。 sorted(v, key=lambda x: x['Date']))
会做到这一点
将它们合并成一行,就可以得到上面提到的单线
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.