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] ))
我有以下词典列表。我想在 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] ))