Python新手-记一次股权穿透层级打分(森林实现)

前言

一个测试小需求,开发将接口返回的数据输入到oracle中,将数据库中的数据与接口返回的数据进行diff check
需求很简单,但是数据量十分庞大,如果手工测试不仅效率低,需要更多的测试人员,而且测试点的覆盖率不会很全面,因此当然是写一个简单的脚本。

工具

Mac OS、oracle以及Python3.9

一、具体内容

前几个维度没有开发逻辑,因此脚本相对比较好写,可以将oracle的相关数据转换为json格式,然后与接口返回的json数据进行diff(可以用deepdiff这个第三方库,很好用,感觉可以更深层次的开发),但是股权穿透需要穿三层股权关系,而且涉及开发逻辑,因此用上了许久不用的数据结构。
看这个维度容易让人望文生义,一个简单的链表加数组就可以解决,但其中必须要有股权关系的逻辑路线,思来想去,决定用森林实现。

二、N叉树的实现

幸运的是,前人已经栽好了树,treelib这个第三方库专门为实现N叉树设计。具体接口类所暴露的方法可以看官方文档(建议)。原本想将接口数据的关系id放入节点中,但遗憾的是,调试过程中发现节点的id不可以重复。。。于是决定用最笨的方法,随机一个10000至99999之间的五位数然后和逻辑id进行拼接,这样就解决了id重复的问题(五位数的随机偶尔也有重复的情况。。。很偶尔)。这样一个N叉树就实现了。具体代码如下:

from treelib import Tree
import csv
import json
import random


def get_tree(list):
    tree = Tree()
    str1 = str(list['id']) + str(random.randint(10000,99999))
    tree.create_node(str1, str1)
    if list['children'] != '[]':
        for i in range(len(list['children'])):
            str2 = str(list['children'][i]['id']) + str(random.randint(10000,99999))
            tree.create_node(str2, str2, parent=str1)
            if list['children'][i]['children'] != '[]':
                for j in range(len(list['children'][i]['childern'])):
                    str3 = str(list['children'][i]['children'][j]['id']) + str(random.randint(10000,99999))
                    tree.create_node(str3, str3, parent=str2)
    return tree

三、根结点的关联关系

构建好了若干的N叉树,如何将他们关联在一起?最后想到用map的映射关系,Python中的dict正合适,将接口id与以此id为根结点的树进行映射,将他们存储在dict中,这样就可以实现逻辑搜索了,代码很简单,如下所示:

def main():
    file_path1 = '/Users/cuijianwei/归档/pen-investtree'
    file_path2 = '/Users/cuijianwei/删除/CORP_NAME_LIST_455_20210819164633.csv'
    s = split_node_info(file_path1)
    p = read_csv_dic(file_path2)
    dict = {}
    for i in range(len(s)):
        tree = get_tree(s[i])
        dict[str(s[i]['id'])] = tree
    diff_check(p, dict)

这样一个简易版的森林就完成啦

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值