有什么问题吗结构更换一般序列的等价物?

2024-04-20 03:36:03 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有类似的方法结构更换它可以执行以下操作:

>> replace(sequence=[0,1,3], old=[0,1], new=[1,2]) 
[1,2,3]

它应该表现得像结构更换:用另一个序列替换一个序列的“片段”,而不是将“旧”的元素映射为“新”的元素。 谢谢:)


Tags: 方法元素new序列结构oldreplacesequence
2条回答

不,恐怕没有内置函数可以做到这一点,但是您可以创建自己的函数!你知道吗

步骤非常简单,我们只需要在列表上滑动一个窗口,窗口的宽度是len(old)。在每个位置,我们检查窗口是否从==old,如果是,我们在窗口之前切片,插入new,并在之后连接其余的list,这可以通过直接分配给old切片来完成,正如^{}所指出的那样。你知道吗

def replace(seq, old, new):
    seq = seq[:]
    w = len(old)
    i = 0
    while i < len(seq) - w + 1:
        if seq[i:i+w] == old:
            seq[i:i+w] = new
            i += len(new)
        else:
            i += 1
    return seq

一些测试表明它是有效的:

>>> replace([0, 1, 3], [0, 1], [1, 2])
[1, 2, 3]
>>> replace([0, 1, 3, 0], [0, 1], [1, 2])
[1, 2, 3, 0]
>>> replace([0, 1, 3, 0, 1], [0, 1], [7, 8])
[7, 8, 3, 7, 8]
>>> replace([1, 2, 3, 4, 5], [1, 2, 3], [1, 1, 2, 3])
[1, 1, 2, 3, 4, 5]
>>> replace([1, 2, 1, 2], [1, 2], [3])
[3, 3]

正如^{}所指出的,使用for-loop会导致重新评估list中被替换的部分,因此我更新了答案,改为使用while

我尝试过这个方法,但在使用这个方法之前,请阅读about eval() by Ned

import re
import ast

def replace(sequence, old, new):
    sequence = str(sequence)
    replace_s=str(str(old).replace('[', '').replace(']', ''))
    if '.' in replace_s:
        replace_ss=list(replace_s)
        for j,i in enumerate(replace_ss):
            if i=='.':
                try:
                    replace_ss[0]=r"\b"+ replace_ss[0]
                    replace_ss[j]=r".\b"
                except IndexError:
                    pass
        replace_s="".join(replace_ss)


    else:

        replace_s = r"\b" + replace_s + r"\b"


    final_ = str(new).replace('[', '').replace(']', '')
    return ast.literal_eval(re.sub(replace_s, final_, sequence))





print(replace([0, 1, 3], [0, 1], [1, 2]))

输出:

[1, 2, 3]

相关问题 更多 >