按子字典的两个值对字典的字典进行排序

时间:2021-05-09 11:14:33

标签: python-3.x

我有以下代码:

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 成功按顺序对子字典进行排序。但是,我想按 key1 和 key3 排序。我需要改变什么?

2 个答案:

答案 0 :(得分:1)

此方法可以按多个属性对列表进行排序

<块引用>

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

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'}

答案 1 :(得分:1)

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

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

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

修复很简单,sorted 中的 lamda 表达式可以返回多个值,它们将用于对目标字典进行排序。

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'}