2024-04-20 03:36:03 发布
网友
有没有类似的方法结构更换它可以执行以下操作:
>> replace(sequence=[0,1,3], old=[0,1], new=[1,2]) [1,2,3]
它应该表现得像结构更换:用另一个序列替换一个序列的“片段”,而不是将“旧”的元素映射为“新”的元素。 谢谢:)
不,恐怕没有内置函数可以做到这一点,但是您可以创建自己的函数!你知道吗
步骤非常简单,我们只需要在列表上滑动一个窗口,窗口的宽度是len(old)。在每个位置,我们检查窗口是否从==到old,如果是,我们在窗口之前切片,插入new,并在之后连接其余的list,这可以通过直接分配给old切片来完成,正如^{}所指出的那样。你知道吗
len(old)
==
old
new
list
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。
for-loop
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]
不,恐怕没有内置函数可以做到这一点,但是您可以创建自己的函数!你知道吗
步骤非常简单,我们只需要在列表上滑动一个窗口,窗口的宽度是} 所指出的那样。你知道吗
len(old)
。在每个位置,我们检查窗口是否从==
到old
,如果是,我们在窗口之前切片,插入new
,并在之后连接其余的list
,这可以通过直接分配给old
切片来完成,正如^{一些测试表明它是有效的:
正如^{} 所指出的,使用
for-loop
会导致重新评估list
中被替换的部分,因此我更新了答案,改为使用while
。我尝试过这个方法,但在使用这个方法之前,请阅读about eval() by Ned:
输出:
相关问题 更多 >
编程相关推荐