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

如何按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'

错误原因

  1. 对数据结构理解错误:json['timezones']是列表,而非字典,不能直接通过json['timezones']['utc_offset']访问字段,需遍历列表内的字典元素。
  2. sort()方法使用错误:它是列表的原地排序方法,不会返回新列表,赋值给变量会得到None;且排序规则需通过key参数传入函数,而非直接传转换后的值。
  3. 偏移量转换逻辑缺失:直接将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:36:29