如何在Python中替换列表中子序列的所有实例?

如何在Python中替换列表中子序列的所有实例?,python,python-2.7,Python,Python 2.7,我目前使用以下代码: """ Replace all occurrences of subsequence a with b in list l """ def replace_subsequence(l,a,b): for i in range(len(l)): if(l[i:i+len(a)] == a): l[i:i+len(a)] = b 例如: >>> l = [1,2,3] >>> replace

我目前使用以下代码:

""" Replace all occurrences of subsequence a with b in list l """ 
def replace_subsequence(l,a,b):
    for i in range(len(l)):
        if(l[i:i+len(a)] == a):
            l[i:i+len(a)] = b
例如:

>>> l = [1,2,3]
>>> replace_subsequence(l,[2,3],[4])
>>> l
[1, 4]

是否有更有效和/或更优雅的方法来执行此操作?

为了提高效率,您可以在列表中搜索子列表时使用

代码()

def匹配(模式,列表):
匹配项=[]
m=len(列表)
n=长度(模式)
RightmostIndex=预禁止字符移位(模式)
校准数据=0
当对准AT+(n-1)=m:
打破
如果x!=y:
r=最右边的索引。获取(x)
如果x不在RightMostIndex中:
alignedAt=indexInlist+1
其他:
shift=indexInlist-(对齐AT+r)
alignedAt+=(shift>0和shift或alignedAt+1)
打破
elif indexInPattern==0:
匹配。追加(alignedAt)
校准AT+=1
复赛
def预处理禁止字符移位(模式):
map={}
对于X范围内的i(透镜(图案)-1,-1,-1):
c=模式[i]
如果c不在地图中:
map[c]=i
返回图
如果名称=“\uuuuu main\uuuuuuuu”:
匹配=匹配(“安娜”,“香蕉”)
对于匹配项中的整数:
打印“匹配位置:”,整数
打印(匹配==[1,3]和“确定”或“失败”)
匹配=匹配([1,2,3],[0,1,2,3,4,5,6])
对于匹配项中的整数:
打印“列表匹配位置:”,整数
打印(匹配)
使用是一个简单的改进,可以加快代码的速度
xrange
返回一个生成器,因此对于长列表来说,性能改进将特别明显。但是,即使你的测试代码很短,我也得到了不错的增长

使用timeit:

replace_subsequence        0.337936162949, 100000 runs
replace_subsequence_xrange 0.275990962982, 100000 runs

此外,您应该在循环外部为
len(a)
分配一个变量,这样您就不会一直调用
len()
函数。这也将产生显著的加速。

这肯定不是很优雅,但我想知道如果您的数据像示例中那样简单,转换为字符串并使用string.replace是否会执行得更好

def strx(l):
    return str(l).strip('[]')

def replace_substring(l, a, b):
    return strx(l).replace( strx(a), strx(b) ).split(', ')

对于范围内的i(len(l)):
可以缩短为
对于范围内的i(len(l)-len(a)):
当然,但我考虑的更多是不在内存中为每次替换构建列表,而只是在最后。或者甚至可能是一个c实现。我假设数据对象总是
int
?您希望如何处理重叠匹配?与我的示例中相同。然而,我也希望这是一个一般性的讨论,以防其他人需要这样的功能。学习如何编写高效的python脚本也是一个有趣的例子。所以,如果你有一个不同的解决方案,那就写一个答案,前提是你能可靠地将每个可能的列表元素编码为一个唯一的字符。
def strx(l):
    return str(l).strip('[]')

def replace_substring(l, a, b):
    return strx(l).replace( strx(a), strx(b) ).split(', ')