如何将飓风数据按年份分组到字典?解决重复年份值为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返回该年份的所有飓风数据?
错误原因分析
append返回值问题:list.append()是原地修改列表的方法,它的返回值是None,你把这个返回值赋值给字典的key,自然会得到None。- 索引错误:代码中用
list_hurricane[i-1].append(...)操作前一个飓风项的列表,逻辑错误,应该操作当前年份对应的字典列表。 - 依赖外部
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
相关产品推荐
相关产品推荐

