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