需求描述
最近在做路径分析,发现很多重复路径,非常有必要去做一下路径合并
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