Python 中的有序字典(已排序)

Ordered Dictionary (sorted) in Python

我有以下词典列表。我想在 server_resource_name 的基础上得到一个有序的字典。我关注了 How to correctly sort a string with a number inside? 但我想知道是否还有更多 pythonic?

ls = [
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i10_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i11_instance"
    },

    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i7_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i8_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i9_instance"
    }
]

我正在寻找如下所示的输出

ls = [
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i7_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i8_instance"
    },

    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i9_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",      
        "server_resource_name": "i10_instance"
    },
    {
        "flavor": "m1.small",
        "internal_network_name": "inner-net",
        "key_name": "tmp_key",
        "server_resource_name": "i11_instance"
    }
]

我试过的

test1 = []
for i in ls:
     i['server_resource_name']
     test1.append(i['server_resource_name'])
import re
def natural_key(string_):
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]

这给了我测试 2 中的排序结果。 如何让 ls 现在排序?

print("-->", sorted(test1, key=natural_key))

行得通,也许有更好的方法

# Thats for parse number of instance
# print(int(re.findall(r'\d+', ls[0]["server_resource_name"])[0]))
sorted_ls = sorted(ls, key=lambda x: int(re.findall(r'\d+', x["server_resource_name"])[0]))
print(sorted_ls)

也许您可以尝试以下操作:

import re
p=re.compile('(\d+)')
ls.sort(key=lambda x: int(p.findall(x['server_resource_name'])[0] ))