一般来说,序列有 str.replace 等价物吗?
Is there a str.replace equivalent for sequence in general?
有没有类似str.replace的方法可以做到以下几点:
>> replace(sequence=[0,1,3], old=[0,1], new=[1,2])
[1,2,3]
它应该真正像 str.replace 一样:用另一个序列替换序列的 "piece",而不是将 "old" 的元素映射到 "new" 的元素。
谢谢:)
不,恐怕没有执行此操作的内置函数,但是您可以创建自己的函数!
步骤很简单,我们只需要在window宽度为len(old)
的列表上滑动window即可。在每个位置,我们检查 window ==
是否为 old
如果是,我们在 window 之前切片,插入 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]
有没有类似str.replace的方法可以做到以下几点:
>> replace(sequence=[0,1,3], old=[0,1], new=[1,2])
[1,2,3]
它应该真正像 str.replace 一样:用另一个序列替换序列的 "piece",而不是将 "old" 的元素映射到 "new" 的元素。 谢谢:)
不,恐怕没有执行此操作的内置函数,但是您可以创建自己的函数!
步骤很简单,我们只需要在window宽度为len(old)
的列表上滑动window即可。在每个位置,我们检查 window ==
是否为 old
如果是,我们在 window 之前切片,插入 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]