Python-函数不返回结果
正在尝试使用python构建工具。该工具应执行以下操作: 假设我有两个dict-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', '
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行中单独求和,然后递归将冒泡 将下属的姓名和总数输入结果目录
- 当某人没有下属时,递归结束,数据被删除 聚集
None
上,所以使用print()
检查这一行变量中的值-即print(user_sum)
,print(x)
-可能x
是None