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

Python处理CSV订单时addKeysNestedDict递归函数返回None排查

问题原因

核心原因

你的addKeysNestedDict函数只有else分支存在显式return语句,当入参keys长度大于1时,代码走if分支,递归调用函数后没有任何返回操作,Python中所有没有显式return的函数默认返回None,这就是你调用函数拿到None的直接原因。

同时你当前代码里还存在两个可优化的点:

  • 初始化用户结构时meals和weekdays赋值为空字符串'',后续无法存入统计的键值对,应该改为空字典{}
  • 这个场景完全不需要用递归实现,直接用字典生成式代码更简洁易懂,也不会出现递归返回值的问题

修复方案

方案1:修改递归函数补全return

def addKeysNestedDict(dictionary, keys):
    if len(keys) > 1:
        if keys[0] not in dictionary.keys():
            dictionary[keys[0]] = {'meals': {}, 'weekdays': {}}
        # 补全if分支的return,返回递归调用的结果
        return addKeysNestedDict(dictionary, keys[1:])
    else:
        dictionary[keys[0]] = {'meals': {}, 'weekdays': {}}
        print('inside addKeys: ')
        print(dictionary)
        return dictionary

修改后调用函数就能正常拿到构建好的字典。

方案2:直接用字典生成式初始化(更推荐)

完全可以删掉addKeysNestedDict函数,在organize_orders里直接用一行代码完成结构初始化:

people = {name: {'meals': {}, 'weekdays': {}} for name in set_names}

后续统计逻辑参考

你注释里的统计逻辑可以优化为以下写法,直接遍历订单统计次数,不需要嵌套循环集合:

for order in list_dict:
    name = order['name']
    food = order['food']
    day = order['day']
    # 统计餐品购买次数
    people[name]['meals'][food] = people[name]['meals'].get(food, 0) + 1
    # 统计工作日下单次数
    people[name]['weekdays'][day] = people[name]['weekdays'].get(day, 0) + 1

最终得到的结构和你预期的一致,注意你之前写的预期结构存在语法错误,正确的嵌套结构应该是:

{
    'user1': {
        'meals': {'hamburger': 2, 'pizza': 1},
        'weekdays': {'monday': 1, 'tuesday':1, 'friday': 1}
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:12:03