我有一个XML文件(约500行),该文件在Python中转换为嵌套的有序字典。我需要根据值对它进行排序,但是由于它嵌套太多,并且其中包含列表,所以我迷路了。我一直在寻找答案,试图找到一种对与列表混合的字典进行排序的方法。但是到目前为止还没有运气。
这是我最接近的。 Python: Sort nested dictionary by value但是,因为我有一个包含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”进行排序?
答案 0 :(得分:0)
将sorted
与lambda
一起使用
例如:
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'}]
答案 1 :(得分:0)
问题是您试图获取.items,而您只想对列表进行排序,因此不需要所有这些内容,只需像下面这样简单即可:
for i in ('foo', 'bar'):
your_dict['History'][i] = sorted(your_dict['History][i], key=lambda x:x['date'])
答案 2 :(得分:0)
>>> 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'}]
说明 以下列表推导会将字典项作为键值对返回
[(k,v) for k,v in d['History'].items()]
这将过滤键值对,并仅在值的类型为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']))
可以做到
将它们合并在一行中,就可以得到上述的单线