我有一个模式列表和一个替换列表。模式包含重复的元素,但它们对应于不同的替换。
txt=132GOasmHOMEwokdslNOWsdwkGO239NOW
pattern=['GO','HOME','NOW','GO','NOW']
REPLACEMENT=['why','nope','later','aha','genes']
期望的输出将是132whyasmnopokdsllatersdwkaha239个基因
完成顺序替换最有效的方法是什么?
发布于 2018-08-15 03:20:42
txt='132GOasmHOMEwokdslNOWsdwkGO239NOW'
pattern=['GO','HOME','NOW','GO','NOW']
REPLACEMENT=['why','nope','later','aha','genes']
for i,x in enumerate(pattern):
txt = txt.replace(x,REPLACEMENT[i], 1)
为了好玩,这里是时间测试,因为这个问题要求效率最高。
pattern=['GO','HOME','NOW','GO','NOW']
REPLACEMENT=['why','nope','later','aha','genes']
t = time.time()
for z in xrange(1000000):
txt = '132GOasmHOMEwokdslNOWsdwkGO239NOW'
for a,b in zip(pattern,REPLACEMENT):
txt=txt.replace(a,b,1)
print time.time() - t
t = time.time()
for z in xrange(1000000):
txt2 = '132GOasmHOMEwokdslNOWsdwkGO239NOW'
for i,x in enumerate(pattern):
txt2 = txt2.replace(x,REPLACEMENT[i], 1)
print time.time() - t
t = time.time()
for z in xrange(1000000):
txt3 = '132GOasmHOMEwokdslNOWsdwkGO239NOW'
x = dict(zip(reversed(pattern), reversed(REPLACEMENT)))
for k in x:
txt3 = txt3.replace(k,x[k], 1)
print time.time() - t
t = time.time()
for z in xrange(1000000):
txt = '132GOasmHOMEwokdslNOWsdwkGO239NOW'
new_d = iter(REPLACEMENT)
new_result = re.sub('\b' + '|'.join(pattern) + '\b', lambda _: next(new_d), txt)
print time.time() - t
其结果是:
2.57099986076
2.48500013351
3.50499987602
4.23699998856
正如您所看到的,enumerate的效率略高于zip,而其他两个的效率则不尽相同。
发布于 2018-08-15 03:20:58
您可以同时遍历两个列表,并且每次仅替换pattern的第一个实例:
for a,b in zip(pattern,REPLACEMENT):
txt=txt.replace(a,b,1)
发布于 2018-08-15 03:28:17
我觉得你应该试试这个:
import re
txt = "132GOasmHOMEwokdslNOWsdwkGO239NOW"
pattern = ['GO','HOME','NOW','GO','NOW']
REPLACEMENT = ['why','nope','later','aha','genes']
txt1 = re.sub(pattern[1], REPLACEMENT[1], txt)
txt2 = re.sub(pattern[2], REPLACEMENT[2], txt1)
txt3 = re.sub(pattern[3], REPLACEMENT[3], txt2)
txt4 = re.sub(pattern[4], REPLACEMENT[4], txt3)
FINAL_TEXT = re.sub(pattern[5], REPLACEMENT[5], txt4)
print(FINAL_TEXT)
和输出:
"132whyasmnotwokdsllatersdwkaha239genes"
https://stackoverflow.com/questions/51848354
复制相似问题