如何按Excel单元格地址规则对Python字典的键进行排序?
解决方案
要实现按Excel单元格的自然顺序(先按行号升序,同内行按列字母升序)排序字典,核心是给sorted()函数自定义排序规则——默认字符串排序会把"B10"排在"B2"前面(字符串比较时"1" < "2"),不符合Excel的单元格排序逻辑。
实现思路
拆分每个单元格地址的列字母和行号,将行号转为整数(保证数字按数值大小排序),然后以(行号, 列字母)作为排序键,对字典的键值对进行排序,最后转换为有序字典(Python 3.7+ 原生字典已支持有序)。
完整代码示例
import re # 原字典 cell_dict = {"A1":"value1", "C1":"value3", "B1":"value2", "C2":"value6", "A2":"value4", "B2":"value5", "B10":"value7", "C10":"value8"} # 提取排序键:拆分列字母与行号 def get_sort_key(cell_addr): match = re.match(r'([A-Za-z]+)(\d+)', cell_addr) if match: col = match.group(1).upper() row = int(match.group(2)) # 排序优先级:行号(整数)> 列字母(字符串) return (row, col) return (0, cell_addr) # 兼容异常格式的地址 # 排序并生成目标字典 sorted_dict = dict(sorted(cell_dict.items(), key=lambda x: get_sort_key(x[0]))) # 输出验证 for k, v in sorted_dict.items(): print(f'"{k}":"{v}",')
运行结果
"A1":"value1", "B1":"value2", "C1":"value3", "A2":"value4", "B2":"value5", "C2":"value6", "B10":"value7", "C10":"value8",
可选替代方案(无需正则)
如果不需要处理"AA12"这类多列字母的地址,也可以用遍历拆分的方式提取行号和列字母:
def get_sort_key(cell_addr): split_idx = 0 while split_idx < len(cell_addr) and cell_addr[split_idx].isalpha(): split_idx += 1 col = cell_addr[:split_idx].upper() row = int(cell_addr[split_idx:]) return (row, col)
内容的提问来源于stack exchange,提问作者ecopy
相关产品推荐
相关产品推荐

