繁体   English   中英

按字典的键值对子目录进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM