假设一个字典看起来像这样,其中我们有一个带有某个数字作为键的字符串(不一定按任何顺序,也不保证它会处于连续序列中,并且键遵循的唯一模式是随机密钥字符串在字符串末尾会在
-
): 之后有一个数字
nested_dict = {
"outter_key_layer-3": {
"inner_key_layer-4": "random_value",
"inner_key_layer-2": "random_value",
...
"inner_key_layer-11": "random_value",
"inner_key_layer-22": "random_value",
...
...
"inner_key_layer-31": "random_value",
"inner_key_layer-112": "random_value",
...
},
"outter_key_layer-54": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
...
"inner_key_layer-11": "random_value",
"inner_key_layer-112": "random_value",
...
"inner_key_layer-12": "random_value",
"inner_key_layer-11": "random_value",
...
},
...
"outter_key_layer-13": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
...
"inner_key_layer-5": "random_value",
"inner_key_layer-10": "random_value",
...
"inner_key_layer-6": "random_value",
"inner_key_layer-23": "random_value",
...
},
...
}
我怎样才能实现以下目标,其中键均按字母顺序排列,但数字也被视为整数进行排序:
nested_dict = {
"outter_key_layer-1": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
...
"inner_key_layer-11": "random_value",
"inner_key_layer-12": "random_value",
...
...
"inner_key_layer-111": "random_value",
"inner_key_layer-112": "random_value",
...
},
"outter_key_layer-2": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
...
"inner_key_layer-11": "random_value",
"inner_key_layer-12": "random_value",
...
"inner_key_layer-111": "random_value",
"inner_key_layer-112": "random_value",
...
},
...
"outter_key_layer-11": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
...
"inner_key_layer-11": "random_value",
"inner_key_layer-12": "random_value",
...
"inner_key_layer-111": "random_value",
"inner_key_layer-112": "random_value",
...
},
...
}
尝试从之前提出的问题修改以下内容,但我无法像尝试过滤掉整数并以某种方式对它们进行排序那样进行任何操作:
sorted_dict = {key: dict(sorted(nested_dict[key].items())) for key in sorted(nested_dict)}
使用上面的嵌套内部键,不会按预期排序,数值仍将被视为字符串:
inner_key_layer-1
,inner_key_layer-11
,...,inner_key_layer-12
,inner_key_layer-2
...
我知道有很多与使用 python 排序相关的不同用例问题,但欢迎任何帮助或建议。谢谢。
LE:在做了一些进一步的研究之后,我偶然发现了
natsort
包,并且以这种方式使用它基本上产生了我正在寻找的东西:
from natsort import natsorted
my_sorted_dict = {key: dict(natsorted(nested_dict[key].items())) for key in sorted(nested_dict)}
但是我仍然想知道是否有一种方法可以在不使用或不必安装另一个软件包的情况下执行此操作。
诀窍是拆分键以获得用于排序的项目列表。请记住将最后一个随机数转换为
int()
。列表中的项目按元素进行比较:
from pprint import pprint
nested_dict = {
"outter_key_layer-3": {
"inner_key_layer-4": "random_value",
"inner_key_layer-2": "random_value",
"inner_key_layer-11": "random_value",
"inner_key_layer-22": "random_value",
"inner_key_layer-31": "random_value",
"inner_key_layer-112": "random_value",
},
"outter_key_layer-54": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
"inner_key_layer-11": "random_value",
"inner_key_layer-112": "random_value",
"inner_key_layer-12": "random_value",
},
"outter_key_layer-13": {
"inner_key_layer-1": "random_value",
"inner_key_layer-2": "random_value",
"inner_key_layer-5": "random_value",
"inner_key_layer-10": "random_value",
"inner_key_layer-6": "random_value",
"inner_key_layer-23": "random_value",
},
}
def sort_key_func(x: tuple):
key, _value = x
splitted = key.split("-")
splitted[-1] = int(splitted[-1])
return splitted
def sorted_dict(d: dict):
result = dict(sorted(d.items(), key=sort_key_func))
for k, v in result.items():
if isinstance(v, dict):
result[k] = sorted_dict(v)
return result
pprint(sorted_dict(nested_dict), sort_dicts=False)
输出:
{'outter_key_layer-3': {'inner_key_layer-2': 'random_value',
'inner_key_layer-4': 'random_value',
'inner_key_layer-11': 'random_value',
'inner_key_layer-22': 'random_value',
'inner_key_layer-31': 'random_value',
'inner_key_layer-112': 'random_value'},
'outter_key_layer-13': {'inner_key_layer-1': 'random_value',
'inner_key_layer-2': 'random_value',
'inner_key_layer-5': 'random_value',
'inner_key_layer-6': 'random_value',
'inner_key_layer-10': 'random_value',
'inner_key_layer-23': 'random_value'},
'outter_key_layer-54': {'inner_key_layer-1': 'random_value',
'inner_key_layer-2': 'random_value',
'inner_key_layer-11': 'random_value',
'inner_key_layer-12': 'random_value',
'inner_key_layer-112': 'random_value'}}