You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以Pythonic方式按server_resource_name对字典列表自然排序?

按带数字的字符串字段自然排序字典列表的Pythonic实现

嘿,你已经找对了核心的自然排序逻辑——那个natural_key函数完美解决了带数字字符串的排序问题!现在要把它应用到字典列表的排序上,其实只需要稍微调整一下用法,就能写出非常Pythonic的代码,完全不用手动循环收集字段~

直接用sorted()或list.sort()实现排序

Python的内置排序函数(sorted()用于返回新列表,list.sort()用于原地排序)都支持key参数,我们可以用一个lambda表达式把每个字典映射到它的server_resource_name字段,再传给你的natural_key函数就行。

完整代码示例:

import re

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" }
]

def natural_key(string_):
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]

# 方式1:返回新的排序后的列表
sorted_ls = sorted(ls, key=lambda x: natural_key(x['server_resource_name']))

# 方式2:原地修改原列表排序
# ls.sort(key=lambda x: natural_key(x['server_resource_name']))

# 打印验证结果
for item in sorted_ls:
    print(item)

运行后就能得到你期望的有序字典列表,完全符合需求。

为什么这是更Pythonic的写法?

  • 避免了冗余的手动循环收集字段的操作,直接利用内置函数的key参数完成映射,代码更简洁
  • 遵循了Python的“简洁胜于复杂”、“利用内置工具”的设计哲学
  • 两种排序方式(返回新列表/原地排序)可以根据场景灵活选择,可读性拉满

如果你想让natural_key函数更贴合字典排序的场景,也可以直接修改它接受字典作为参数,这样lambda表达式可以更短:

def natural_key_for_dict(d):
    string_ = d['server_resource_name']
    return [int(s) if s.isdigit() else s for s in re.split(r'(\d+)', string_)]

sorted_ls = sorted(ls, key=natural_key_for_dict)

这种写法也很清晰,看你个人习惯选择就行~

内容的提问来源于stack exchange,提问作者JustCurious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:33:50