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

将等长数组转为年份键字典的两个技术咨询

问题解答

疑问1:字典的值是否会保留原顺序

Python 3.7及以上版本中,普通dict会保留键的插入顺序,但你要关注的值的顺序有明确结论:

  • 若用列表作为字典的值,只要按原数组顺序向列表追加元素,列表内部的元素顺序会和原数据完全一致——因为列表是有序容器,append操作始终把元素放在末尾,不会打乱原有顺序。

疑问2:代码问题排查与修正

原代码的问题点

  1. 冗余遍历字典键:已经拿到当前日期的年份temp,没必要再遍历整个Data的键去匹配,直接通过Data[temp]操作即可。
  2. 错误使用zip:zip(arr[i], raindata[i])会把单个日期字符串拆成字符,和单个数字(不可迭代)强行配对,完全不符合「单个日期+单个雨量组成元组」的需求。
  3. 值被覆盖而非追加:每次循环直接给Data[key]赋值新对象,导致之前的元素被覆盖,且未用列表存储多个元组。
  4. 初始化错误:把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:45:34