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
相关产品推荐
相关产品推荐

