使用dict 可以减少您需要迭代的项目数量,这对于一些长输入可能很有价值。
txt = '132GOasmHOMEwokdslNOWsdwkGO239NOW'
pattern = ['GO','HOME','NOW','GO','NOW']
REPLACEMENT = ['why','nope','later','aha','genes']
x = dict(zip(reversed(pattern), reversed(REPLACEMENT)))
for k in x:
txt = txt.replace(k,x[k], 1)
print(txt)
编辑:为了好玩,我在备份中添加了一个基准,以说明减少需要迭代的项目数量对于一些长输入可能很有价值。当您使用琐碎的测试数据集时,最高效并不总是显而易见的。
#! /usr/bin/env python
# -*- coding: UTF8 -*-
def alpha(pattern, REPLACEMENT, txt):
for a,b in zip(pattern,REPLACEMENT):
txt=txt.replace(a,b,1)
def beta(pattern, REPLACEMENT, txt):
for i,x in enumerate(pattern):
txt = txt.replace(x,REPLACEMENT[i], 1)
def gamma(pattern, REPLACEMENT, txt):
x = dict(zip(reversed(pattern), reversed(REPLACEMENT)))
for k in x:
txt = txt.replace(k,x[k], 1)
def delta(pattern, REPLACEMENT, txt):
new_d = iter(REPLACEMENT)
new_result = re.sub('\b' + '|'.join(pattern) + '\b', lambda _: next(new_d), txt)
if __name__ == '__main__':
import timeit, re
txt = '132GOasmHOMEwokdslNOWsdwkGO239NOW'
pattern = ['GO','HOME','NOW','GO','NOW']
REPLACEMENT = ['why','nope','later','aha','genes']
print("Trivial inputs: len(pattern): {}, len(REPLACEMENT): {}, len(txt): {}".format(len(pattern), len(REPLACEMENT), len(txt)));
print("alpha: ", timeit.timeit("alpha(pattern, REPLACEMENT, txt)", setup="from __main__ import alpha, txt, pattern, REPLACEMENT"))
print("beta: ", timeit.timeit("beta( pattern, REPLACEMENT, txt)", setup="from __main__ import beta, txt, pattern, REPLACEMENT"))
print("gamma: ", timeit.timeit("gamma(pattern, REPLACEMENT, txt)", setup="from __main__ import gamma, txt, pattern, REPLACEMENT"))
print("delta: ", timeit.timeit("delta(pattern, REPLACEMENT, txt)", setup="from __main__ import delta, txt, pattern, REPLACEMENT"))
print("")
txtcopy = txt
patterncopy = pattern.copy()
REPLACEMENTcopy = REPLACEMENT.copy()
for _ in range(3):
txt = txt + txtcopy
pattern.extend(patterncopy)
REPLACEMENT.extend(REPLACEMENTcopy)
print("Small inputs: len(pattern): {}, len(REPLACEMENT): {}, len(txt): {}".format(len(pattern), len(REPLACEMENT), len(txt)));
print("alpha: ", timeit.timeit("alpha(pattern, REPLACEMENT, txt)", setup="from __main__ import alpha, txt, pattern, REPLACEMENT"))
print("beta: ", timeit.timeit("beta( pattern, REPLACEMENT, txt)", setup="from __main__ import beta, txt, pattern, REPLACEMENT"))
print("gamma: ", timeit.timeit("gamma(pattern, REPLACEMENT, txt)", setup="from __main__ import gamma, txt, pattern, REPLACEMENT"))
print("delta: ", timeit.timeit("delta(pattern, REPLACEMENT, txt)", setup="from __main__ import delta, txt, pattern, REPLACEMENT"))
print("")
txt = txtcopy
pattern = patterncopy.copy()
REPLACEMENT = REPLACEMENTcopy.copy()
for _ in range(300):
txt = txt + txtcopy
pattern.extend(patterncopy)
REPLACEMENT.extend(REPLACEMENTcopy)
print("Larger inputs: len(pattern): {}, len(REPLACEMENT): {}, len(txt): {}".format(len(pattern), len(REPLACEMENT), len(txt)));
print("alpha: ", timeit.timeit("alpha(pattern, REPLACEMENT, txt)", setup="from __main__ import alpha, txt, pattern, REPLACEMENT"))
print("beta: ", timeit.timeit("beta(pattern, REPLACEMENT, txt)", setup="from __main__ import beta, txt, pattern, REPLACEMENT"))
print("gamma: ", timeit.timeit("gamma(pattern, REPLACEMENT, txt)", setup="from __main__ import gamma, txt, pattern, REPLACEMENT"))
print("delta: ", timeit.timeit("delta(pattern, REPLACEMENT, txt)", setup="from __main__ import delta, txt, pattern, REPLACEMENT"))
结果:
Trivial inputs: len(pattern): 5, len(REPLACEMENT): 5, len(txt): 33
alpha: 4.60048107800003
beta: 4.169088881999869
gamma: 5.7612637450001785
delta: 11.371387353000046
Small inputs: len(pattern): 20, len(REPLACEMENT): 20, len(txt): 132
alpha: 17.281149661999734
beta: 15.131949634000193
gamma: 7.339897444000144
delta: 26.50896787900001
Larger inputs: len(pattern): 1505, len(REPLACEMENT): 1505, len(txt): 9933
alpha: 18766.660852467998
beta: 17640.960064803
gamma: 64.01868645999639
delta: 901.3577002189995
因此,对于微不足道的输入,enumerate 解决方案比 zip 快一点,比 iter 快很多。当输入的长度略微增加时,不删除重复项的成本开始显现,我的解决方案运行时间不到一半。当运行具有大量重复项的长输入时,@eatmeimadish 解决方案的完成时间比删除重复项时长 27555%。哎哟。