Python-函数不返回结果

Python-函数不返回结果,python,dictionary,recursion,Python,Dictionary,Recursion,正在尝试使用python构建工具。该工具应执行以下操作: 假设我有两个dict- dict() #1 - data {'name_id': 'manager_id_1', 'name_first': 'manager_name_1', 'direct_report:' [{'name_id': 'employee_id_1', 'name_first': 'employee_name_1', 'direct_report': []}, {'name_id': 'employee_id_2', '

正在尝试使用python构建工具。该工具应执行以下操作:

假设我有两个dict-

dict() #1 - data
{'name_id': 'manager_id_1', 'name_first': 'manager_name_1', 'direct_report:' [{'name_id': 'employee_id_1', 'name_first': 'employee_name_1', 'direct_report': []}, {'name_id': 'employee_id_2', 'name_first': 'employee_name_2', 'direct_report': []}, {'name_id': 'employee_id_3', 'name_first': 'employee_name_3', 'direct_report': [{'name_id': 'employee_id_3_1', 'name_first': 'employee_name_3_1', 'direct_report': []}, {'name_id': 'employee_id_3_2', 'name_first': 'employee_name_3_2', 'direct_report': []}]}


dict() #2 - data_count
{'employee_id_1': 2, 'xxxx_id': 3, 'employee_id_2': 5, 'xxxx_id': 5, 'employee_id_3_2': 6}
第一个dict包括所有个人信息和报告结构,而第二个dict包括每个人的数据计数组(包括dict 1中的用户)

任务是将总数相加,并在新的dict中显示管理器下的总数,如下所示:

{manager_name_1: 7}
{employee_name_3: 6}
这是我写的函数,但它没有返回任何内容。如果我删除返回结果[data_name],我会得到一个错误-TypeError:不支持的+:“int”和“NoneType”的操作数类型。今天试图调试这个,但无法找出我哪里做错了,任何建议都将不胜感激

def data_recursive(data_sample, data_count_sample):
    result = dict()

    data_user = str
    data_name = str
    data_report = str

    for key, value in data_sample.items(): 
        if 'name_id' in key:
            data_user = value
        elif 'name_first' in key:
            data_name = value
        else:
            data_report = value

            if len(data_report) == 0:
                result[data_name] = data_count_sample.get(data_user, 0)

                return data_count_sample.get(data_user, 0)
            else:
                user_sum = 0
                for data_users in data_report:
                    x = recusive = data_recursive(data_users, data_count_sample)
                    user_sum = user_sum + x

                result[data_name] = data_count_sample.get(data_user, 0) + user_sum
                return result[data_name]

    print(result)
    return(result)

有拼写错误,dict格式不正确。检查已更正的代码示例

data_sample = { 'name_id': 'manager_id_1',
                'name_first': 'manager_name_1',
                'direct_report': [
                    {
                        'name_id': 'employee_id_1',
                        'name_first': 'employee_name_1',
                        'direct_report': []
                    },
                    { 'name_id': 'employee_id_2',
                      'name_first': 'employee_name_2',
                      'direct_report': []
                    },
                    { 'name_id': 'employee_id_3',
                      'name_first': 'employee_name_3',
                      'direct_report': [{
                                  'name_id': 'employee_id_3_1',
                                  'name_first': 'employee_name_3_1',
                                  'direct_report': []
                                       }]
                    },
                    { 'name_id': 'employee_id_3_2',
                          'name_first': 'employee_name_3_2',
                          'direct_report': []
                    }]
               }

data_count_sample = { 'employee_id_1': 2,
                      'xxxx_id': 3,
                      'employee_id_2': 5,
                      'xxxx_id': 5,
                      'employee_id_3_2': 6 
                    }


def data_recursive(data_sample, data_count_sample):
    result = dict()
    data_user = str
    data_name = str
    for key, value in data_sample.items():
        if 'name_id' in key:
            data_user = value
        elif 'name_first' in key:
            data_name = value
        else:
            data_report = value

            if len(data_report) == 0:
                result[data_name] = data_count_sample.get(data_user, 0)

                return data_count_sample.get(data_user, 0)
            else:
                user_sum = 0
                for data_users in data_report:
                    x = data_recursive(data_users, data_count_sample)
                    user_sum = user_sum + x

                result[data_name] = data_count_sample.get(data_user, 0) + user_sum
                return result[data_name]
    return result


output = data_recursive(data_sample, data_count_sample)
print(output)
输出

13

我建议将结果字典作为参数传递给
data\u recursive()
方法。将签名更改为:

def data_recursive(data_sample, data_count_sample, result):
并删除该行:

result = dict()
然后,当调用该方法时,请使用:

ret = dict()
data_recursive(data_sample, data_count_sample, ret)

并且
ret
dict应该保存您的结果。

为了获得所需的理货dict,我的建议如下:

def data_recursive(data, data_count):
name = data['name_first']
result = {name: 0}
report = data['direct_report']
if report:
    result[name] = sum([data_count.get(r['name_id'], 0) for r in report])
    for d in [data_recursive(reporter, data_count) for reporter in report]:
        for key, value in d.items():
            result[key] = value        
else:
    result[name] = data_count.get(data['name_id'], 0)
return result
结果

 {'manager_name_1': 7,
 'employee_name_1': 2,
 'employee_name_2': 5,
 'employee_name_3': 6,
 'employee_name_3_1': 0,
 'employee_name_3_2': 6}
注释

  • 为了清晰起见,减少了一些嵌套以及一些名称 缩短
  • 无需循环查看钥匙和钥匙的id 当前迭代只使用了一次,所以我跳过了存储它, 而报告和名称经常被使用
  • 因为这些值的总和 对于每个人来说,只有1级深度(例如,员工id 3 2不是 如果在示例数据中 总计为7,而不是13),每个人的值之和为 在第6行中单独求和,然后递归将冒泡 将下属的姓名和总数输入结果目录
  • 当某人没有下属时,递归结束,数据被删除 聚集

您发布的两个词典不是有效的词典。请更正它们。谢谢@JohnAnderson-更正错误应该会显示哪一行有问题,它还显示问题出在
None
上,所以使用
print()
检查这一行变量中的值-即
print(user_sum)
print(x)
-可能
x
None