QAQzz1133 2022-12-17 12:57 采纳率: 100%
浏览 87
已结题

Python 递归找上游

#背景
cur_table source_table
A C
A B
B D
D E
… …
现在有一张表,里面存着两个字段,cur_table代表现有的表,source_table代表现在的表对应的上游表;如图,表A对应的上游表有C和B,B对应的上游表为D,D对应的上游表为E;

#问题
通过Ptyhon 或者 SQL,实现找到现有表的所有上游相关表;

A:C,B,D,E
B:D,E
D:E

背景列的只是举例,实际表中,现有表相关的血缘关系可能有上百层;本人目前会使用SQL,重复left join的笨办法,不能解决血缘关系数量多的情景;

  • 写回答

3条回答 默认 最新

  • ShowMeAI 2022-12-17 13:45
    关注
    • 下列程序从标准输入读取字符串,直到遇到空行为止。每行的格式为 "当前表 上游表",用一个空格隔开。例如,"table1 table2" 表示 "table1" 表依赖于 "table2" 表。

    • 接下来,程序遍历字典的每个键,并计算出那些表是这个表的下游表(即依赖于这个表的表)。为了计算下游表,程序从当前表开始,递归地搜索上游表,直到所有的上游表都被搜索完为止。最后,将计算出的下游表集合更新到字典中。

    • 最后,程序打印出构建的字典。结果应该是每个表及其所有下游表的列表。

    # 建立空字典,用于存储每个表格的来源
    upstream_tables = {}
    
    # 逐行读入字符串
    for index, row in df.iterrows():
        # 拆分为两个单词
        cur_table, source_table = row[0], row[1]
        # 为当前表格建立来源集合,或将来源表格加入来源集合
        upstream_tables.setdefault(cur_table, set()).add(source_table)
    
    # 遍历所有表格
    for key in upstream_tables.keys():
        # 取出当前表格的来源表格集合
        downstream_table = upstream_tables[key]
        # 建立临时集合,用于存储间接来源表格
        temp = set()
        # 当来源表格集合不为空时
        while downstream_table:
            # 取出来源表格集合中的一个表格
            a = downstream_table.pop()
            # 将其加入临时集合
            temp.add(a)
            # 如果这个表格还有来源表格
            if a in upstream_tables:
                # 将这些来源表格加入来源表格集合
                downstream_table.update(upstream_tables[a])
        # 将临时集合存回字典
        upstream_tables[key] = temp
    
    # 输出上游表
    print(upstream_tables)
    # 输出结果df
    res_df = pd.DataFrame({'cur_table': upstream_tables.keys(), 'source_table': upstream_tables.values()})
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月17日
  • 已采纳回答 12月17日
  • 创建了问题 12月17日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。