用字典的键值对子字典列表进行排序

时间:2018-07-19 11:27:35

标签: python dictionary nested

我有一个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”进行排序?

3 个答案:

答案 0 :(得分:0)

sortedlambda一起使用

例如:

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']))可以做到

将它们合并在一行中,就可以得到上述的单线