按照依赖关系排序

import copy
import utils.functool


@utils.functool.settimeout(timeout=15)
def dependsOnSort(testFunNames, dependRelation):
    """
    有个问题就是如果出现A依赖B,而B又依赖A就会出现问题
    :param testFunNames: 一个列表,被排序的列表[a,b,c,d,...]
    :param dependRelaton: 依赖关系[(a,b),(c,b),...],其中元祖中的第一个值代表被依赖项,第二个值代表依赖项
    :return: 返回按照依赖关系排序后的数组
    """
    # 排序后的执行函数顺序
    target = []
    tmp = copy.deepcopy(testFunNames)
    while True:
        # 用来记录依赖项,即低优先级执行,可能有重复需要set去重
        dependings = []
        # 用来记录删除的依赖关系中的依赖项,也是下次再次用来去除依赖项的数据源
        # depended = []
        if False not in map(lambda x: x is None, dependRelaton):
            break
        # 第一步,从RL中提取出依赖项
        for _ in dependRelaton:
            if _ is None:
                continue
            depend, depending = _
            dependings.append(depending)
        # 移除依赖的函数名,剩下的是需要被优先执行的
        for _ in set(dependings):
            tmp.remove(_)
        # 第二步, 从函数依赖关系中,删除被优先执行的关系项
        for _ in dependRelation:
            if _ is None:
                continue
            depend, depending = _
            if depend in tmp:
                index = dependRelation.index(_)
                dependRelation.pop(index)
                dependRelation.insert(index, None)
        # 第三步, 将本次计算的可以先执行的函数,添加到上一次的计算出来的后面
        target += tmp
        # 补集, 下一次需要排序函数名
        tmp = list(set(testFunNames) - set(target))
    # +未被依赖的函数名,直接放在队尾
    return target + (list(set(testFunNames) - set(target)))


if __name__ == "__main__":
    testFunNames = ["test_01", "test_02", "test_03", "test_04", "test_05", "test_06"]
    dependRelaton = [("test_01", "test_02"),
                     ("test_01", "test_04"),
                     ("test_02", "test_03"),
                     ("test_04", "test_03"),
                     ("test_05", "test_06")
                     ]
    print(dependsOnSort(testFunNames, dependRelaton))
    pass

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值