如何按utc_offset值排序JSON时区文件并解决排序报错
时区JSON数据排序问题解决
原始JSON数据
{ "timezones":[ { "id":1, "name":"(UTC) Coordinated Universal Time", "utc_offset":"+0" }, { "id":2, "name":"(UTC+8:45) Australian Central Standard Time", "utc_offset":"+8:45" }, { "id":3, "name":"(UTC-5) Acre Time", "utc_offset":"-5" }, { "id":4, "name":"(UTC+8:45) Australian Central Western Standard Time", "utc_offset":"+8:45" } ] }
排序需求
- 按
utc_offset值从负到正排序 - 若
utc_offset相同,按name字段的字母顺序排序
期望排序结果
{ "timezones":[ { "id":3, "name":"(UTC-5) Acre Time", "utc_offset":"-5" }, { "id":1, "name":"(UTC) Coordinated Universal Time", "utc_offset":"+0" }, { "id":2, "name":"(UTC+8:45) Australian Central Standard Time", "utc_offset":"+8:45" }, { "id":4, "name":"(UTC+8:45) Australian Central Western Standard Time", "utc_offset":"+8:45" } ] }
错误代码及报错信息
尝试的代码:
lines = lines.sort(int(json['timezones']['utc_offset']), reverse=True) print(lines)
报错:
AttributeError: 'dict' object has no attribute 'sort'
错误原因
- 对数据结构理解错误:
json['timezones']是列表,而非字典,不能直接通过json['timezones']['utc_offset']访问字段,需遍历列表内的字典元素。 sort()方法使用错误:它是列表的原地排序方法,不会返回新列表,赋值给变量会得到None;且排序规则需通过key参数传入函数,而非直接传转换后的值。- 偏移量转换逻辑缺失:直接将
utc_offset转成int会丢失分钟信息(如+8:45无法直接转整数),导致排序不准确。
正确实现代码
import json # 读取或定义JSON数据 data = { "timezones":[ {"id":1,"name":"(UTC) Coordinated Universal Time","utc_offset":"+0"}, {"id":2,"name":"(UTC+8:45) Australian Central Standard Time","utc_offset":"+8:45"}, {"id":3,"name":"(UTC-5) Acre Time","utc_offset":"-5"}, {"id":4,"name":"(UTC+8:45) Australian Central Western Standard Time","utc_offset":"+8:45"} ] } # 定义排序键函数:将utc_offset转换为总分钟数,确保排序准确性 def sort_key(timezone): offset = timezone['utc_offset'] # 处理带分钟的偏移格式 if ':' in offset: sign = 1 if offset.startswith('+') else -1 hours, mins = map(int, offset[1:].split(':')) total_minutes = sign * (hours * 60 + mins) else: total_minutes = int(offset) * 60 # 先按总分钟数排序,再按name字母顺序 return (total_minutes, timezone['name']) # 对timezones列表原地排序 data['timezones'].sort(key=sort_key) # 输出格式化后的结果 print(json.dumps(data, indent=3))
代码说明
sort_key函数将utc_offset转换为总分钟数,解决了带分钟的偏移无法直接比较的问题,确保排序逻辑准确。- 通过
sort()方法的key参数传入自定义规则,实现先按偏移量从负到正排序,偏移量相同时按名称字母顺序排序。 sort()是原地排序,直接修改data['timezones'],无需额外赋值。
内容的提问来源于stack exchange,提问作者Anastasia Quart
相关产品推荐
相关产品推荐

