首页 > 编程问答 >查找分层股东关系:在 python 中重构嵌套 if

查找分层股东关系:在 python 中重构嵌套 if

时间:2024-08-05 14:56:54浏览次数:9  
标签:python nested-if

我想找到公司之间的股东关系。 在下面的示例中,“人员 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}")

说明:

  1. 递归函数: find_all_shareholders() 函数是递归的,这意味着它会调用自身来处理嵌套的所有权。
  2. 基本情况: 递归的“基本情况”是当公司没有任何股东(即,它不是 companies 字典中的一个键)时。在这种情况下,函数将返回一个空列表。
  3. 跟踪所有权: ownership 参数跟踪初始股东拥有的当前所有权百分比。这将在递归调用中更新,以计算间接所有权。
  4. 结果聚合: shareholders 列表存储在每次递归调用中找到的所有股东关系。
  5. 初始调用: 使用要分析的初始公司和股东调用 find_all_shareholders() 函数。

此代码避免了显式嵌套的 if 语句,并使用递归简洁高效地处理任意级别的嵌套。

标签:python,nested-if
From: 78833078

相关文章

  • 解决Python的pip问题:WARNING: Retrying (Retry(total=1, connect=None, read=None, re
    相关:pip安装第三方库报错Retrying(Retry(total=1,connect=None,read=None,redirect=None,status=None))国内镜像源下载常用国内源:清华:https://pypi.tuna.tsinghua.edu.cn/simple/阿里云:http://mirrors.aliyun.com/pypi/simple/中国科技大学https://pypi.mirrors.u......
  • Python,volcengine-python-sdk,安装失败,提示which is required to install pyproject.to
    问题描述:我是安装截止20240804发布的最新版本,volcengine-python-sdk-1.0.94.tar.gz报错一报错最后提示:whichisrequiredtoinstallpyproject.toml-basedprojects...note:Thiserrororiginatesfromasubprocess,andislikelynotaproblemwithpip.ERROR:Fai......
  • python_wholeweek3
    目录子函数的使用函数的定义嵌套的使用全局定义和局部定义子函数的使用函数的定义##############函数的三种定义方式##比较两个数大小,max是内置关键字,##第一种定义方式,无参函数#defself_max():#x,y=10,20##ifx>y:#print(x)#el......
  • Python实现简单的情感分析应用
    Python实现简单的情感分析应用情感的力量:走进情感分析的世界什么是情感分析:从日常对话到大数据分析情感分析的应用场景:从社交媒体到客户服务为何Python成为情感分析的最佳拍档准备工作:Python环境与必备库Python安装指南:快速搭建开发环境必不可少的库:nltk与TextBlob的简......
  • Python中的Web开发与API设计
    Python中的Web开发与API设计一、开篇:启航PythonWeb开发之旅1.1Python:不仅仅是脚本语言,更是Web开发的明星1.2Web开发的魔法森林:从静态到动态的转变二、基础篇:PythonWeb开发的基石2.1HTTP协议:互联网通信的通用语言2.2Flask框架:轻装上阵的小巧之选2.3Django框架:全......
  • Python实现简单的模型调优技术
    Python实现简单的模型调优技术一、开篇:模型调优的魅力所在1.1模型调优:不只是参数游戏1.2为什么好的模型也需要调优二、基础篇:理解模型调参的必要性2.1模型评估指标:选择合适的尺子2.2常见调参方法:从手动到自动化2.3验证集的重要性:不要让模型裸奔三、实战篇:动手......
  • SpringBoot-书店信息管理系统+93494(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP
    基于springboot书店信息管理系统摘 要书店信息管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分,管理员管理主要功能包括:首页、轮播图、公告栏、资源管理(图书资讯、资讯分类)交流管理(留言板、留言板分类)系统用户(管理员、顾客用户......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - Canvas和SVG元素定位
    1.简介今天宏哥分享的在实际测试工作中很少遇到,比较生僻,如果突然遇到我们可能会脑大、懵逼,一时之间不知道怎么办?所以宏哥这里提供一种思路供大家学习和参考。2.SVG简介svg也是html5新增的一个标签,它跟canvas很相似。都可以实现绘图、动画。但是svg绘制出来的都是矢量图,不像canv......
  • 第十三章 -------------------WPF 和IronPython 联合编程
    1为什么我想用实现WPF和IronPython联合编程?我想解决的问题是利用已经写好的C#Class经过脚本的组合,使的原本单一的逻辑经过组合之后编程一个流程。我查阅了许多资料,也是参考了别人的代码。至于为什么要这么写我想来好多原因,其中最主要的原因可能就是为了适应程序的多变化S......
  • python中序列的学习
    序列目录序列序列的通用操作在python中,有这样一些类型,他们的成员是有序排列的,并且可以通过下表访问成员,这些类型称之为序列。包括:列表、range、元组和字符串;序列的通用操作函数描述备注len(item)计算容器中元素的个数del(item)删除变量del有两种方式max(item)......