首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当模式包含重复项时,如何在python中按顺序替换模式

当模式包含重复项时,如何在python中按顺序替换模式
EN

Stack Overflow用户
提问于 2018-08-15 03:14:26
回答 3查看 164关注 0票数 3

我有一个模式列表和一个替换列表。模式包含重复的元素,但它们对应于不同的替换。

代码语言:javascript
复制
txt=132GOasmHOMEwokdslNOWsdwkGO239NOW
pattern=['GO','HOME','NOW','GO','NOW']
REPLACEMENT=['why','nope','later','aha','genes']

期望的输出将是132whyasmnopokdsllatersdwkaha239个基因

完成顺序替换最有效的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-15 03:20:42

代码语言:javascript
复制
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)

为了好玩,这里是时间测试,因为这个问题要求效率最高。

代码语言:javascript
复制
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

其结果是:

代码语言:javascript
复制
2.57099986076
2.48500013351
3.50499987602
4.23699998856

正如您所看到的,enumerate的效率略高于zip,而其他两个的效率则不尽相同。

票数 0
EN

Stack Overflow用户

发布于 2018-08-15 03:20:58

您可以同时遍历两个列表,并且每次仅替换pattern的第一个实例:

代码语言:javascript
复制
for a,b in zip(pattern,REPLACEMENT):
    txt=txt.replace(a,b,1)
票数 3
EN

Stack Overflow用户

发布于 2018-08-15 03:28:17

我觉得你应该试试这个:

代码语言:javascript
复制
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)

和输出:

代码语言:javascript
复制
"132whyasmnotwokdsllatersdwkaha239genes"
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51848354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档