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

时间:2018-01-17 09:36:53

标签: python dictionary ordereddictionary

我有下面的字典列表。我想在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_)]

这给了我test2中的排序结果。 如何让ls现在处于排序状态?

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

2 个答案:

答案 0 :(得分:3)

多数民众赞成有可能有更好的方法来做到这一点

# 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)

答案 1 :(得分:0)

可能您可以尝试以下:

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