用python中的另一个子列表替换子列表

dar*_*yde 11 python list

我想用列表中的子列表替换a另一个子列表.像这样的东西:

a=[1,3,5,10,13]
Run Code Online (Sandbox Code Playgroud)

让我们说我想要一个子列表,如:

a_sub=[3,5,10]
Run Code Online (Sandbox Code Playgroud)

并替换它

b_sub=[9,7]
Run Code Online (Sandbox Code Playgroud)

所以最终的结果将是

print(a) 
>>> [1,9,7,13]
Run Code Online (Sandbox Code Playgroud)

有什么建议?

ins*_*get 13

In [39]: a=[1,3,5,10,13]

In [40]: sub_list_start = 1

In [41]: sub_list_end = 3

In [42]: a[sub_list_start : sub_list_end+1] = [9,7]

In [43]: a
Out[43]: [1, 9, 7, 13]
Run Code Online (Sandbox Code Playgroud)

希望有所帮助


Gar*_*tty 13

您可以使用列表切片很好地完成此操作:

>>> a=[1, 3, 5, 10, 13]
>>> a[1:4] = [9, 7]
>>> a
[1, 9, 7, 13]
Run Code Online (Sandbox Code Playgroud)

那么我们如何在这里得到指数呢?好吧,让我们从找到第一个开始吧.我们逐项扫描,直到找到匹配的子列表,并返回该子列表的开始和结束.

def find_first_sublist(seq, sublist, start=0):
    length = len(sublist)
    for index in range(start, len(seq)):
        if seq[index:index+length] == sublist:
            return index, index+length
Run Code Online (Sandbox Code Playgroud)

我们现在可以进行更换 - 我们从一开始就更换我们找到的第一个,然后在我们新完成更换之后尝试找到另一个.我们重复这个,直到我们再也找不到要替换的子列表.

def replace_sublist(seq, sublist, replacement):
    length = len(replacement)
    index = 0
    for start, end in iter(lambda: find_first_sublist(seq, sublist, index), None):
        seq[start:end] = replacement
        index = start + length
Run Code Online (Sandbox Code Playgroud)

我们可以很好地使用它:

>>> a=[1, 3, 5, 10, 13]
>>> replace_sublist(a, [3, 5, 10], [9, 7])
>>> a
[1, 9, 7, 13]
Run Code Online (Sandbox Code Playgroud)