【发布时间】:2020-08-28 10:46:08
【问题描述】:
我有一些代表事件顺序的字符串:
s1 = 'A->B->E->D->A->C->B->D'
s2= 'A->B->C->A->B'
s3 = 'A->B->A
在每个字符串中,我想找到最大长度为 N 的所有重复模式。
import itertools
def find_all_comb(event_list,max_events):
all_combs = []
for j in range(1,max_events+1):
all_combs.extend(list(set(['->'.join(x) for x in list(itertools.combinations(event_list,j))])))
return all_combs
def find_repeating_patterns(x):
split_events = x.split("->")
all_combs = find_all_comb(split_events,int(len(x)/2))
repeating_patterns = []
for comb in all_combs:
c_split_event = [p for p in split_events if p in comb]
if '->'.join(c_split_event).count(comb) > 1:
repeating_patterns.extend([comb])
output_list = []
longest_repeating_patterns = [s for s in repeating_patterns if any(set(s).issuperset(set(i)) and len(s) > len(i) for i in repeating_patterns)]
while output_list != longest_repeating_patterns:
if longest_repeating_patterns == []:
break
output_list = longest_repeating_patterns.copy()
longest_repeating_patterns = [s for s in longest_repeating_patterns if any(set(s).issuperset(set(i)) and len(s) > len(i) for i in longest_repeating_patterns)]
return output_list
对于s1,这将返回正确的模式[A,B,D],对于s2,它返回[A,B]。对于s3,它应该返回[A],但它返回一个空列表。这是因为这行:
[s for s in repeating_patterns if any(set(s).issuperset(set(i)) and len(s) > len(i) for i in repeating_patterns)]
这不允许len(s) > len(i)。
我怎样才能在这里捕获这两种情况?
【问题讨论】:
-
要求似乎不清楚,因为
[A,B,D]是一个子集而不是子序列。再说一次,您的代码不会忽略顺序,因此它也不是一个简单的子集。 -
@ekhumoro
[A,B,D]是那里的一个aubsequence。 -
在标题中添加了“重复”一词,希望能把事情弄清楚。
-
我在帖子的最后一行还有一个更简洁的要求,也应该澄清一下。
-
这真的是关于集合和序列的吗?不清楚如何。
标签: python combinations subsequence