如何以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
相关产品推荐
相关产品推荐

