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

遍历列表构建字典时,为何夜间时段对应的列表仅保留单个值?

问题原因

你遇到的问题是字典键的重复赋值覆盖:
当处理夜间时段的多个条目时,它们对应的字典键都是'2022-10-16 00:00:00',但你每次都直接用my_dict[key] = [value[i]]给这个键赋值新的单元素列表,这会把之前存储的列表完全替换掉,最终只保留最后一次赋值的[900.0]。

修正方案

方案1:手动检查键是否存在

修改循环内的逻辑,先判断键是否已在字典中:

import datetime as dt

dates = ['2022-10-16 17:00:00', '2022-10-16 18:00:00', '2022-10-16 21:00:00', '2022-10-16 22:00:00']
values = [1920.0, 570.0, 1680.0, 900.0]

def to_dict():
    my_dict = {}
    for i in range(len(dates)):
        date_str = dates[i]
        value = values[i]
        hour = dt.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S").hour
        if 6 < hour <= 17:
            key = date_str[:11] + "06:00:00"
            if key in my_dict:
                my_dict[key].append(value)
            else:
                my_dict[key] = [value]
        else:
            key = date_str[:11] + "00:00:00"
            if key in my_dict:
                my_dict[key].append(value)
            else:
                my_dict[key] = [value]
    print(my_dict)
    return my_dict

to_dict()

方案2:使用collections.defaultdict简化逻辑

用defaultdict自动初始化列表类型的键值,省去手动检查的步骤:

import datetime as dt
from collections import defaultdict

dates = ['2022-10-16 17:00:00', '2022-10-16 18:00:00', '2022-10-16 21:00:00', '2022-10-16 22:00:00']
values = [1920.0, 570.0, 1680.0, 900.0]

def to_dict():
    my_dict = defaultdict(list)
    for date_str, value in zip(dates, values):
        hour = dt.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S").hour
        if 6 < hour <= 17:
            key = date_str[:11] + "06:00:00"
        else:
            key = date_str[:11] + "00:00:00"
        my_dict[key].append(value)
    # 可选:转换为普通字典
    print(dict(my_dict))
    return dict(my_dict)

to_dict()

两种方案运行后都会得到你期望的结果:

{'2022-10-16 06:00:00': [1920.0], '2022-10-16 00:00:00': [570.0, 1680.0, 900.0]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:15:33