Python如何按数字值对字典列表的interface字段正确排序
问题原因
现有排序逻辑直接取interface字段的字符串值作为排序依据,执行的是字符串字典序比较:逐位对比字符ASCII值,不会解析字符串中的数值大小。例如对比0/3和0/16时,斜杠后第一位字符3的ASCII码大于1,就会判定0/3 > 0/16,最终排序结果和数值排序的预期不符。
修复方案
排序时将interface字符串按/拆分,把拆分后的每段编号转为整数,以整数元组作为排序键,即可按端口号的实际数值从小到大排序。
修改后的完整可运行代码:
from pprint import pprint output_list = [{'interface': '0/20', 'mac': '01:23:45:67:89:AB'}, {'interface': '0/16', 'mac': '12:34:56:78:9A:BC'}, {'interface': '0/31', 'mac': '23:45:67:89:AB:CD'}, {'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'}, {'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'}] mac_list = sorted( output_list, key=lambda d: tuple(int(seg) for seg in d['interface'].split('/')) ) pprint(mac_list)
运行代码后输出完全匹配预期结果:
[{'interface': '0/3', 'mac': '45:67:89:AB:CD:EF'}, {'interface': '0/5', 'mac': '34:56:78:9A:BC:DE'}, {'interface': '0/16', 'mac': '12:34:56:78:9A:BC'}, {'interface': '0/20', 'mac': '01:23:45:67:89:AB'}, {'interface': '0/31', 'mac': '23:45:67:89:AB:CD'}]
该写法同时兼容多段式接口编号(如
1/0/12这类框/槽/端口格式的接口名),无需额外修改即可正确排序。
内容的提问来源于stack exchange,提问作者Ryan Bell
相关产品推荐
相关产品推荐

