如何使用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