如何使用python捕获列表中的开放序列
我有两个列表,一个是包含所有元素的主列表。另一种是序列表,它需要与主列表进行比较,并提取开放和封闭的序列模式及其主要索引位置 开放序列模式:按顺序出现的模式项的序列(其他元素可以出现在两者之间) 闭合序列模式:严格模式/精确匹配(其间不会出现其他元素) 例如:如何使用python捕获列表中的开放序列,python,Python,我有两个列表,一个是包含所有元素的主列表。另一种是序列表,它需要与主列表进行比较,并提取开放和封闭的序列模式及其主要索引位置 开放序列模式:按顺序出现的模式项的序列(其他元素可以出现在两者之间) 闭合序列模式:严格模式/精确匹配(其间不会出现其他元素) 例如: 您需要定义两个函数 def get_closed_sequence_pattern(input_list, sequence_input): str_input = ''.join(input_list) str_sequ
您需要定义两个函数
def get_closed_sequence_pattern(input_list, sequence_input):
str_input = ''.join(input_list)
str_sequence = ''.join(sequence_input)
sequence_len = len(sequence_input)
if str_sequence in str_input:
start_index = str_input.index(str_sequence)
return [(index, input_list[index]) for index in range(start_index, start_index + sequence_len)]
else:
return False
def get_open_sequence_pattern(input_list, sequence_input):
try:
start_index = input_list.index(sequence_input[0])
end_index = input_list[start_index:].index(sequence_input[-1]) + start_index
except:
return False
return [(index, input_list[index]) for index in range(start_index, end_index + 1)]
然后你可以得到你想要的:
main_input_list = ['a','b','c','a','d','e','f','g']
sequence_input_1 = ['a','b','c']
print(get_open_sequence_pattern(main_input_list, sequence_input_1))
输出:
[(0, 'a'), (1, 'b'), (2, 'c')]
[(1, 'b'), (2, 'c'), (3, 'a'), (4, 'd'), (5, 'e')]
--
输出:
[(0, 'a'), (1, 'b'), (2, 'c')]
[(1, 'b'), (2, 'c'), (3, 'a'), (4, 'd'), (5, 'e')]
--
对于重复问题(闭合序列模式),您可以使用:
def get_all_closed_sequence_pattern(input_list, sequence_input):
ans = []
sequence_len = len(sequence_input)
for i in range(0, len(input_list) - sequence_len + 1):
if input_list[i: i+sequence_len] == sequence_input:
ans.append([(index, input_list[index]) for index in range(i, i+sequence_len)])
return ans
--
--
输出:
--对于开放序列模式的复制问题,您对输出的要求是模糊的。你可以先明确自己的需求,然后再做一些尝试。我使用了天堂的方法并创建了最终方法来捕获开放序列和封闭序列
def get_all_seqs(input_list, sequence_input):
out_put = []
try:
start_indices = [i for i, x in enumerate(input_list) if x == sequence_input[0]]
end_indices = [i for i, x in enumerate(input_list) if x == sequence_input[-1]]
for i in start_indices:
for j in end_indices:
if i<j:
out_put.append([(index, input_list[index]) for index in range(i, j + 1)])
out_put = [item for item in out_put if bool(re.match(r"^"+"(.*)".join(sequence_input)+"+","".join([strr[1] for strr in item])))]
except:
pass
return out_put
def get_all_seq(输入列表、序列输入):
输出=[]
尝试:
如果x==序列输入[0],则开始索引=[i表示枚举(输入列表)中的i,x]
end_索引=[i代表i,x在枚举(输入_列表)中,如果x==序列_输入[-1]]
对于start_索引中的i:
对于终端指数中的j:
如果我说“开放和封闭序列”是什么意思?输入和输出之间的确切关系是什么?我再次更新了问题,请选择是。这解决了大部分问题。但是,函数名的命名不同,请将“打开”更改为“关闭”。如果我们有重复的序列呢?我必须从主输入列表中提取所有可能的序列。主输入列表=['a'、'b'、'c'、'a'、'd'、'e'、'f'、'g'、'b'、'a'、'b'、'd'、'a']序列输入列表=['b'、'a']打印(获取闭合序列模式(主输入列表、序列输入1))打印(获取开放序列模式(主输入列表、序列输入1))
[[(0, 'a'), (1, 'b'), (2, 'c')], [(8, 'a'), (9, 'b'), (10, 'c')]]
def get_all_seqs(input_list, sequence_input):
out_put = []
try:
start_indices = [i for i, x in enumerate(input_list) if x == sequence_input[0]]
end_indices = [i for i, x in enumerate(input_list) if x == sequence_input[-1]]
for i in start_indices:
for j in end_indices:
if i<j:
out_put.append([(index, input_list[index]) for index in range(i, j + 1)])
out_put = [item for item in out_put if bool(re.match(r"^"+"(.*)".join(sequence_input)+"+","".join([strr[1] for strr in item])))]
except:
pass
return out_put