将等长数组转为年份键字典的两个技术咨询
问题解答
疑问1:字典的值是否会保留原顺序
Python 3.7及以上版本中,普通dict会保留键的插入顺序,但你要关注的值的顺序有明确结论:
- 若用列表作为字典的值,只要按原数组顺序向列表追加元素,列表内部的元素顺序会和原数据完全一致——因为列表是有序容器,
append操作始终把元素放在末尾,不会打乱原有顺序。
疑问2:代码问题排查与修正
原代码的问题点
- 冗余遍历字典键:已经拿到当前日期的年份
temp,没必要再遍历整个Data的键去匹配,直接通过Data[temp]操作即可。 - 错误使用
zip:zip(arr[i], raindata[i])会把单个日期字符串拆成字符,和单个数字(不可迭代)强行配对,完全不符合「单个日期+单个雨量组成元组」的需求。 - 值被覆盖而非追加:每次循环直接给
Data[key]赋值新对象,导致之前的元素被覆盖,且未用列表存储多个元组。 - 初始化错误:把
Data[temp]初始化为None,后续未转为列表就直接赋值,无法实现元素追加。
修正后的代码
from datetime import datetime def group_by_year(arr, raindata): data = {} # 直接遍历配对后的日期和雨量,更简洁 for date_str, rain_val in zip(arr, raindata): year = datetime.strptime(date_str, '%d.%m.%Y').year # 年份不存在则初始化空列表 if year not in data: data[year] = [] # 向对应年份的列表追加(date, rain)元组 data[year].append((date_str, rain_val)) return data dates = ['01.03.2021','01.04.2021','01.01.2022'] rain = [0,5,8] print(group_by_year(dates, rain))
输出结果
{2021: [('01.03.2021', 0), ('01.04.2021', 5)], 2022: [('01.01.2022', 8)]}
(注:原预期输出中2022对应的雨量值有误,原数据中应为8而非0)
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

