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

用python中的另一个子列表替换子列表,python,list,Python,List,我想用另一个子列表替换列表a中的子列表。大概是这样的: a=[1,3,5,10,13] 假设我想要一个子列表,如: a_sub=[3,5,10] 并将其替换为 b_sub=[9,7] 因此,最终结果将是 print(a) >>> [1,9,7,13] 有什么建议吗?您需要从start\u index到end\u index+1取一个片段,并将您的子列表分配给它 就像您可以做的那样:-a[0]=5,您可以类似地将子列表分配给您的切片:-a[0:5]->创建从索引0到索引

我想用另一个子列表替换列表
a
中的子列表。大概是这样的:

a=[1,3,5,10,13]
假设我想要一个子列表,如:

a_sub=[3,5,10]
并将其替换为

b_sub=[9,7]
因此,最终结果将是

print(a) 
>>> [1,9,7,13]

有什么建议吗?

您需要从
start\u index
end\u index+1
取一个片段,并将您的子列表分配给它

就像您可以做的那样:-
a[0]=5
,您可以类似地将子列表分配给您的
切片
:-
a[0:5]
->创建从
索引0到索引4的切片

您只需找出要替换的
子列表的
位置

>>> a=[1,3,5,10,13]

>>> b_sub = [9, 7]

>>> a[1:4] = [9,7]  # Substitute `slice` from 1 to 3 with the given list

>>> a
[1, 9, 7, 13]
>>> 
正如您所看到的,
替换的
子列表不必与
替换的
子列表具有相同的长度

事实上,您可以将4长度列表替换为2长度列表,反之亦然

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]

希望这对您有所帮助

您可以通过列表切片很好地做到这一点:

>>> a=[1, 3, 5, 10, 13]
>>> a[1:4] = [9, 7]
>>> a
[1, 9, 7, 13]
那么我们如何得到这里的指数呢?好吧,让我们从找到第一个开始。我们逐项扫描,直到找到匹配的子列表,然后返回该子列表的开始和结束

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
我们现在可以做我们的替换-我们从一开始,替换我们找到的第一个,然后在我们新完成的替换之后尝试找到另一个。我们重复这个过程,直到找不到要替换的子列表为止

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
我们可以很好地使用:

>>> a=[1, 3, 5, 10, 13]
>>> replace_sublist(a, [3, 5, 10], [9, 7])
>>> a
[1, 9, 7, 13]

这是另一种方法。如果需要替换多个子列表,则此方法有效:

a=[1,3,5,10,13]
a_sub=[3,5,10]
b_sub=[9,7]

def replace_sub(a, a_sub, b_sub):
    a_str = ',' + ','.join(map(str, a)) + ','
    a_sub_str = ',' + ','.join(map(str, a_sub)) + ','
    b_sub_str = ',' + ','.join(map(str, b_sub)) +','

    replaced_str = a_str.replace(a_sub_str, b_sub_str)[1 : -1]

    return map(int, replaced_str.split(','))
>>> a=[1,3,5,10,13,3,5,10]
>>> a_sub=[3,5,10]
>>> b_sub=[9,7]
>>> replace_sub(a, a_sub, b_sub)
[1, 9, 7, 13, 9, 7]
结果:

>>> replace_sub(a, a_sub, b_sub)
[1, 9, 7, 13]
>>> replace_sub([10, 13, 4], [3, 4], [7])
[10, 13, 4] #[3,4] is not in the list so nothing happens
替换多个子列表:

a=[1,3,5,10,13]
a_sub=[3,5,10]
b_sub=[9,7]

def replace_sub(a, a_sub, b_sub):
    a_str = ',' + ','.join(map(str, a)) + ','
    a_sub_str = ',' + ','.join(map(str, a_sub)) + ','
    b_sub_str = ',' + ','.join(map(str, b_sub)) +','

    replaced_str = a_str.replace(a_sub_str, b_sub_str)[1 : -1]

    return map(int, replaced_str.split(','))
>>> a=[1,3,5,10,13,3,5,10]
>>> a_sub=[3,5,10]
>>> b_sub=[9,7]
>>> replace_sub(a, a_sub, b_sub)
[1, 9, 7, 13, 9, 7]

我什么都没试过,因为我不知道怎么做。我在stackoverflow上搜索了大约2个小时的想法。你知道
a\u sub
a
中的位置吗?
a_sub
是否总是在
a
中?我不知道
a_sub
a
中的位置,
a_sub
将总是在
a
@AshwiniChaudhary中,如果元素是唯一的,并且a中存在sub_列表。如果子列表不在…谢谢。正是我所需要的。我认为您的
find_sublist
函数可以简化为
next(((i,i+length)对于枚举(seq)中的i,x,如果seq[i:i+length]==sublist),则为None)
。但是,根据不同的使用案例,我们可能需要对替换过程的工作原理更加精巧一些(比如说,您想用包含自身的东西重复替换某些东西。)@user2357112很好的捕获-修复方法是确保在进行替换之前计算
find_sublists()
,而不是在我们迭代时。编辑以修复。还有一些更棘手的注意事项。首先。其次,不考虑子字符串替换函数中更常见的行为,其中不考虑在前一个匹配中开始的匹配。我想这就是问题的全部。有趣的是在任意长度的列表中找到任意长度的子列表。没有破坏堆栈。@DSM我解决了您指出的错误,希望没有其他错误。