根据子dict的两个值对dict的dict进行排序



我有以下代码:

from collections import OrderedDict
test_dict = {'test1':{'key1': 'dog', 'key2': 'dennis', 'key3': 'bbb'},
'test2':{'key1': 'apple', 'key2': 'arthur', 'key3': 'fff'},
'test3':{'key1': 'bear', 'key2': 'bernard', 'key3': 'xxx'},
'test4':{'key1': 'elephant', 'key2': 'eric', 'key3': 'rrr'},
'test5':{'key1': 'cat', 'key2': 'charlie', 'key3': 'lll'}
}

sorted_dict = OrderedDict(sorted(test_dict.items(), key=lambda i: i[1]['key1'][1]['key3']))
for key, value in sorted_dict.items():
print(key, value)

这会产生错误:

TypeError: string indices must be integers

但是,如果我这样修改:

sorted_dict = OrderedDict(sorted(test_dict.items(), key=lambda i: i[1]['key1']))

它将仅按key1成功地按顺序对子dict进行排序。但是,我想按关键字1和关键字3进行排序。我需要更改什么?

在您的代码片段中,请注意这一行:

sorted_dict = OrderedDict(sorted(test_dict.items(), key=lambda i: i[1]['key1'][1]['key3']))

这里,test_dict.items()返回包含键值对的元组列表的dict_item对象。在您的情况下,键是字符串,值是dict。因此,在lambda表达式中,当您选择i[1]['key1']时,您已经获得了附加到该键的字符串值。因此,当您尝试访问i[1]['key1'][1]['key3']时,您尝试从单个字符访问key3值。因此CCD_ 6。

修复很容易,sorted中的lamda表达式可以返回多个值,它们将用于对目标dict进行排序

sorted_dict = OrderedDict(
sorted(test_dict.items(), key=lambda i: (i[1]["key1"], i[1]["key3"]))
)

此外,如果您使用的是Python 3.7及更高版本,那么实际上并不需要OrderedDict,因为本机字典保留了键的顺序。这也是有效的:

sorted_dict = dict(sorted(test_dict.items(), key=lambda i: (i[1]["key1"], i[1]["key3"])))

它将打印以下内容:

test2 {'key1': 'apple', 'key2': 'arthur', 'key3': 'fff'}
test3 {'key1': 'bear', 'key2': 'bernard', 'key3': 'xxx'}
test5 {'key1': 'cat', 'key2': 'charlie', 'key3': 'lll'}
test1 {'key1': 'dog', 'key2': 'dennis', 'key3': 'bbb'}
test4 {'key1': 'elephant', 'key2': 'eric', 'key3': 'rrr'}

这种方法可以根据几个属性对列表进行排序

按两个键排序使用两种比较方法对集合中的元素进行排序

sorted_dict = OrderedDict(sorted(test_dict.items(),key=lambda i:(i[1]["key1"],i[1]["key3"])))
for key, value in sorted_dict.items():
print(key, value)

输出:

test2 {'key1': 'apple', 'key2': 'arthur', 'key3': 'fff'}
test3 {'key1': 'bear', 'key2': 'bernard', 'key3': 'xxx'}
test5 {'key1': 'cat', 'key2': 'charlie', 'key3': 'lll'}
test1 {'key1': 'dog', 'key2': 'dennis', 'key3': 'bbb'}
test4 {'key1': 'elephant', 'key2': 'eric', 'key3': 'rrr'}

最新更新