根据子父节点关系生成血缘关系-py

多个子父节点构成一条或多条关系线,n->n
输入:父节点\t子节点
输出:依赖树上的所有路径:如 A->B->C->D

FILELIST = []
LLIST = []
RLIST = []

LSET = set()
RSET = set()


def jurgeHeadFlag(headNodeLinkSet):
    for headNodeLink in headNodeLinkSet:
        nodeHead = headNodeLink.split('->')[0]
        if nodeHead in LSET:
            return True
    return False
def jurgeTailFlag(headNodeLinkSet):
    for headNodeLink in headNodeLinkSet:
        nodeHead = headNodeLink.split('->')[-1]
        if nodeHead in RSET:
            return True
    return False

# 处理head依赖的节点 输入单节点  输出所有的上游依赖关系 list
def makeHeadDep(headNode):
    headNodeLinkSet = {headNode}
    # 无上游 直接输出本节点
    if not jurgeHeadFlag(headNodeLinkSet): return [headNode]
    # set中存在上游的head
    while jurgeHeadFlag(headNodeLinkSet):
        headNodeLinkSetTemp = set()
        for headNodeLink in headNodeLinkSet:
            # print('headNodeLink==='+headNodeLink)
            nodeHead = headNodeLink.split('->')[0]
            # print('nodeHead==='+nodeHead)
            # 有head的
            if nodeHead in LSET:
                for nodes in FILELIST:
                    head_ = nodes.split('\t')[1]
                    tail_ = nodes.split('\t')[0]
                    if nodeHead == tail_ and head_ not in headNodeLink:
                        if headNodeLink in headNodeLinkSetTemp:
                            headNodeLinkSetTemp.remove(headNodeLink)
                        headNodeLinkSetTemp.add(head_ + '->' + headNodeLink)
                    else:continue
            # 没有的 直接temp输出原依赖串
            else:
                headNodeLinkSetTemp.add(headNodeLink)
        headNodeLinkSet = headNodeLinkSetTemp
    return list(headNodeLinkSet)


# 处理tail被依赖的节点
def makeTailDep(tailNodeL):
    tailNodeLinkSet = {tailNodeL}
    # 无上游 直接输出本节点
    if not jurgeTailFlag(tailNodeLinkSet): return [tailNodeL]
    # set中存在上游的tail
    while jurgeTailFlag(tailNodeLinkSet):
        tailNodeLinkSetTemp = set()
        for tailNodeLink in tailNodeLinkSet:
            nodeTail = tailNodeLink.split('->')[-1]
            # 有tail的
            if nodeTail in RSET:
                for nodes in FILELIST:
                    head_ = nodes.split('\t')[1]
                    tail_ = nodes.split('\t')[0]
                    if nodeTail == head_ and tail_ not in tailNodeLink:
                        if tailNodeLink in tailNodeLinkSetTemp:
                            tailNodeLinkSetTemp.remove(tailNodeLink)
                        tailNodeLinkSetTemp.add(tailNodeLink + '->' + tail_)
                    else:continue
            # 没有的 直接temp输出原依赖串
            else:
                tailNodeLinkSetTemp.add(tailNodeLink)
        tailNodeLinkSet = tailNodeLinkSetTemp
    return list(tailNodeLinkSet)

if __name__ == '__main__':
    dep_res = set()
    with open(r'D:\MyDesk\已迁移的文件依赖.txt', encoding='utf-8', mode='r') as depfile:
        for dep in depfile:
            t = dep.replace('\n', '').split('\t')[0]
            h = dep.replace('\n', '').split('\t')[1]
            if t != h:
                FILELIST.append(dep.replace('\n', ''))
                LLIST.append(t)
                RLIST.append(h)
                LSET.add(t)
                RSET.add(h)
        depfile.close()
    # 每个节点 串一下所有节点
    for node2 in FILELIST:
        head = node2.split('\t')[1]
        tail = node2.split('\t')[0]
        heads = []
        tails = []

        heads = makeHeadDep(head)
        tails = makeTailDep(tail)
        for dependence in [x+'->'+y for x in heads for y in tails]:
            dep_res.add(dependence)
    dep_res_co = dep_res.copy()
    for de in dep_res:
        dep_res_co.remove(de)
        for d in dep_res_co:
            if de.find(d) != -1:
                dep_res.remove(d)
            elif d.find(de) != -1:
                dep_res.remove(de)
    with open(r'D:\MyDesk\依赖结果.txt', encoding='utf-8', mode='a') as dep_resfile:
        for res in dep_res:
            dep_resfile.write(res+'\n')
        dep_resfile.close()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春马与夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值