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

如何将飓风数据按年份分组到字典?解决重复年份值为None问题

问题描述

我有一个存储飓风数据的嵌套结构列表list_hurricane,结构如下:

简化视图

[[{key1:value1, key2:value2,...}], [{key1:value1, key2:value2,...}]]

每个子列表包含一个飓风信息字典,完整示例:

[
    [{'name': 'Cuba I', 'month': 'October', 'year': 1924, 'max_sustained_wind': 165, 'area_affected': ['Central America', 'Mexico', 'Cuba', 'Florida', 'The Bahamas'], 'damage': 'Damages not recorded', 'death': 90}],
    [{'name': 'San Felipe II Okeechobee', 'month': 'September', 'year': 1928, 'max_sustained_wind': 160, 'area_affected': ['Lesser Antilles', 'The Bahamas', 'United States East Coast', 'Atlantic Canada'], 'damage': '100M', 'death': 4000}],
    [{'name': 'Bahamas', 'month': 'September', 'year': 1932, 'max_sustained_wind': 160, 'area_affected': ['The Bahamas', 'Northeastern United States'], 'damage': 'Damages not recorded', 'death': 16}],
    [{'name': 'Cuba II', 'month': 'November', 'year': 1932, 'max_sustained_wind': 175, 'area_affected': ['Lesser Antilles', 'Jamaica', 'Cayman Islands', 'Cuba', 'The Bahamas', 'Bermuda'], 'damage': '40M', 'death': 3103}],
    # ... 更多数据
]

我需要把年份作为key,对应年份的所有飓风字典作为value存入新字典,但部分年份有多个飓风。尝试用append处理时,重复年份对应的value显示为None,错误代码如下:

years = [1924, 1928, 1932, 1932, 1933....]
dic_years = {}
for i in range(len(list_hurricane)):
    if years[i] in dic_years:
        dic_years[years[i]] = list_hurricane[i-1].append(list_hurricane[i])
    else:
        dic_years[years[i]] = list_hurricane[i]

请问如何正确合并,让每个年份key返回该年份的所有飓风数据?


错误原因分析
  1. append返回值问题:list.append()是原地修改列表的方法,它的返回值是None,你把这个返回值赋值给字典的key,自然会得到None。
  2. 索引错误:代码中用list_hurricane[i-1].append(...)操作前一个飓风项的列表,逻辑错误,应该操作当前年份对应的字典列表。
  3. 依赖外部years列表:单独维护years列表容易出现索引不匹配问题,直接从飓风字典中读取year字段更可靠。

正确解法

方法1:基础字典循环处理

直接遍历飓风数据,从每个字典中提取年份,动态维护字典的value列表:

dic_years = {}
for hurricane_entry in list_hurricane:
    # 取出子列表中的飓风字典
    hurricane_dict = hurricane_entry[0]
    year = hurricane_dict['year']
    # 年份已存在则追加,不存在则初始化列表
    if year in dic_years:
        dic_years[year].append(hurricane_dict)
    else:
        dic_years[year] = [hurricane_dict]

方法2:用collections.defaultdict简化代码

defaultdict可以自动为不存在的key初始化指定类型(这里是列表),代码更简洁:

from collections import defaultdict

dic_years = defaultdict(list)
for hurricane_entry in list_hurricane:
    hurricane_dict = hurricane_entry[0]
    year = hurricane_dict['year']
    dic_years[year].append(hurricane_dict)

# 可选:将defaultdict转换为普通字典
dic_years = dict(dic_years)

两种方法最终都会得到类似这样的结果:

{
    1924: [{'name': 'Cuba I', ...}],
    1928: [{'name': 'San Felipe II Okeechobee', ...}],
    1932: [{'name': 'Bahamas', ...}, {'name': 'Cuba II', ...}],
    # ... 其他年份
}

内容的提问来源于stack exchange,提问作者J8311

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:40:52