我想找到公司之间的股东关系。 在下面的示例中,“人员 1”直接拥有“公司 1”50% 的股份,那么需要检查“公司 1”是否也拥有其他公司的股份。 “公司 1”拥有“公司 2”50% 的股份,“公司 3”拥有 20% 的股份。这意味着“人员 1”间接拥有“公司 2”和“公司 3”的部分股份。
此示例中所需的输出为:
公司 1 : 人员 1 , 0.5
公司 2 : 公司 1 , 0.5
公司 3 : 公司 2 , 0.2
这是我的代码:
companies = {
'Company 1': {
'Person 1': 0.5,
'Person 2': 0.3,
'Person 3': 0.2,
},
'Company 2': {
'Person 4': 0.25,
'Company 1': 0.5,
'Person 5': 0.25,
},
'Company 3': {
'Person 5': 0.6,
'Person 6': 0.2,
'Company 2': 0.2,
},
}
def is_shareholder_in_company(company, companies, shareholder_name):
company_shareholders = companies[company]
for shareholder, ownership_percentage in company_shareholders.items():
if shareholder_name == shareholder:
print(company, ':',shareholder, ',', ownership_percentage)
return True
for i in companies:
if is_shareholder_in_company(i, companies, 'Person 1'):
temp_name = i
for j in companies:
if is_shareholder_in_company(j, companies, i):
temp_name = j
for x in companies:
if is_shareholder_in_company(x, companies, j):
temp_name = x
如何重构嵌套的 if ?嵌套 if 的数量取决于“公司”数据,并且未知。 谢谢。
可以使用递归函数来更好地处理未知的嵌套级别。以下是工作原理:
companies = {
'公司 1': {
'人员 1': 0.5,
'人员 2': 0.3,
'人员 3': 0.2,
},
'公司 2': {
'人员 4': 0.25,
'公司 1': 0.5,
'人员 5': 0.25,
},
'公司 3': {
'人员 5': 0.6,
'人员 6': 0.2,
'公司 2': 0.2,
},
}
def find_all_shareholders(company, companies, initial_shareholder=None, ownership=1.0):
"""
递归查找给定公司所有股东。
Args:
company: 要查找股东的公司名称。
companies: 包含公司及其股东信息的字典。
initial_shareholder: 初始股东名称(用于递归调用)。
ownership: 初始股东拥有的所有权百分比(用于递归调用)。
Returns:
所有股东关系的列表,格式为元组:(公司,股东,所有权百分比)。
"""
shareholders = []
for shareholder, percentage in companies.get(company, {}).items():
# 计算当前所有权百分比
current_ownership = ownership * percentage
if initial_shareholder:
shareholders.append((company, initial_shareholder, current_ownership))
# 递归查找公司股东
if shareholder in companies:
shareholders.extend(find_all_shareholders(shareholder, companies, shareholder, current_ownership))
return shareholders
# 从“人员 1”开始查找所有股东关系
all_relationships = find_all_shareholders('公司 1', companies, '人员 1', 0.5)
# 打印所有股东关系
for company, shareholder, percentage in all_relationships:
print(f"{company} : {shareholder} , {percentage}")
说明:
-
递归函数:
find_all_shareholders()
函数是递归的,这意味着它会调用自身来处理嵌套的所有权。 -
基本情况:
递归的“基本情况”是当公司没有任何股东(即,它不是
companies
字典中的一个键)时。在这种情况下,函数将返回一个空列表。 -
跟踪所有权:
ownership
参数跟踪初始股东拥有的当前所有权百分比。这将在递归调用中更新,以计算间接所有权。 -
结果聚合:
shareholders
列表存储在每次递归调用中找到的所有股东关系。 -
初始调用:
使用要分析的初始公司和股东调用
find_all_shareholders()
函数。
此代码避免了显式嵌套的
if
语句,并使用递归简洁高效地处理任意级别的嵌套。