我有以下代码:
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 排序。我需要改变什么?
答案 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'}