python路径合并,相邻元素组的合并

需求描述

最近在做路径分析,发现很多重复路径,非常有必要去做一下路径合并
eg
a -> a -> a 处理后 a
a -> b -> b 处理后 a -> b
a -> b -> a -> b -> c 处理后 a -> b -> c
a -> b -> c -> d -> b -> c -> d -> c 处理后 a -> b -> c -> d -> c
主要是两种类型的处理
1、aa型,相邻元素相同
2、abab型,相邻元素组相同

问题解决

相邻元素的合并

比较简单,就不多做说明,join最后转了一下字符串
#这里多做一下说明,我这里事件是可枚举的,所以事件都有先做了映射(可以用ascll的那些符号,处理速度能快些,主要是相邻元素组合并要用)

def mergeElement(lst):
    if not lst:
        return ''

    result = [str(lst[0])] 
    for i in range(1, len(lst)):
        if lst[i] != lst[i - 1]:  # 如果当前元素与前一个元素相同
            result.append(str(lst[i]))  # 将当前元素添加到结果列表中

    return ''.join(result)

相邻元素组的合并

1、先去做一下唯一映射,事件名称转成唯一映射的符号
2、元素组的长度不确定,从路径长度的一半,到2遍历,中间如果发生过处理,那么这个长度重新为处理后路径长度的一半,再到2遍历
3、每次遍历,路径长度能整除元素组长度,,如果两组,唯一一次,否则就再遍历元素组长度次;不能整除,就是余数次

直接贴代码

# 整体遍历控制
def concel_group(inp):
    ban = len(inp)//2
    while ban >= 2:
        flag, inp = mergeGroup(inp, ban)
        if flag == 1:
            ban = len(inp)//2
        if flag == 0:
            ban -= 1
    return inp
    
# 单次遍历
def mergeGroup(inp, group_size):
    seq = list(inp)
    len_seq = len(seq)
    if len_seq % group_size == 0:  # 整除 不需要移动
        if len_seq // group_size == 2:  # 仅两组
            temp_lst = []
            for s in range(0, len_seq, group_size):
                temp_lst.append("".join(seq[s:s+group_size]))
            str_ = mergeElement(temp_lst)
            if len(str_) == len_seq:
                return 0, inp
            else:
                return 1, str_
        if len_seq // group_size > 2:
            for s in range(0,  group_size, 1):
                temp_lst = []
                for k in range(s, len_seq, group_size):
                    temp_lst.append("".join(seq[k:k + group_size]))
                str_ = mergeElement(temp_lst)
                if len(str_) + s == len(inp):
                    continue
                else:
                    return 1, inp[:s] + str_
    else:
        for s in range(0, len_seq % group_size + 1, 1):
            temp_lst = []
            for k in range(s, len_seq, group_size):
                temp_lst.append("".join(seq[k:k + group_size]))
            str_ = mergeElement(temp_lst)
            # str_ += "".join(seq[len_seq//group_size*group_size+1-s:-1])
            if len(str_) + s == len(inp):
                continue
            else:
                return 1, inp[:s] + str_
    return 0, inp
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值