Python'da birden çok dizeyi tek bir büyük dizede değiştirmenin önerilen yolu nedir?

Çok sayıda dize çifti ve bir büyük dize (bir dosyanın içeriğidir) var. Her bir çiftin birinci üyesinin her oluşumunu ilgili ikincisiyle değiştirmem gerekiyor.

Örneğin, çiftlere sahip olmak ("AA", "BB") ve ("qq", "rt") AA 'nın her oluşumunu BB ve ile değiştirmem gerekiyor rt ile qq .

Çiftlerdeki dizelerin tümü benzersizdir, bu nedenle değiştirme sırası nihai sonuç için önemli değildir.

Python kodum en naif olanı - tüm çiftler tükenene kadar string.replace metodunu art arda uygularım:

>>> s="frsfsdAAsdfvsdfvqqdsff"
>>> pairs=[('AA', 'BB'), ('qq', 'rt')]
>>> for p in pairs:
...   s=s.replace(p[0], p[1])
...
>>> s
'frsfsdBBsdfvsdfvrtdsff'
>>>

Bunun büyük dizeler için kötü bir çözüm olduğuna inanıyorum. Daha verimli bir tane öneren var mı?

Soru Python'da nasıl yapılacağı ile ilgilidir.

Teşekkürler.

4

1 cevap

Önerilen çözümünüzle ilgili başka bir sorun var: ilk değişiklik yapıldıktan sonra sonuçta ortaya çıkan dize eşleşebilir ve aynı karakterler tekrar değiştirilebilir. Örneğin, 'qq' ve 'ff' 'i pairs = [(' qq ',' ff '), (' ff ',' qq ')] .

Bunun yerine deneyebilirsiniz:

>>> d = dict(pairs)
>>> import re
>>> pattern = re.compile('|'.join(re.escape(k) for k in d))
>>> pattern.sub(lambda k:d[k.group()], s))
frsfsdBBsdfvsdfvrtdsff
3
katma
Oh, ancak soruda açıkça belirtmiştim ve şöyle alıntı yapıyorum: Çiftlerdeki dizelerin tümü benzersizdir, bu nedenle değiştirme sırası nihai sonuç için önemli değildir. Sipariş kısmı alakasız olsa bile , önkoşul hala tutar - tüm dizeler benzersizdir.
katma yazar mark, kaynak
Neden? string.replace tüm olayların yerini alır - 'mmmAAmmmmAAmmmAA'.replace (' AA ',' BB ') ==' mmmBBmmmmBBmmmBB ' Doğru
katma yazar mark, kaynak
Şimdi anlıyorum, değiştirme dizesinin diğer karakterlerle birleşimi daha sonra değiştirilecek olan yeni eşleşmeler üretebilir. İyi yakala, teşekkürler.
katma yazar mark, kaynak
@ mark: Bu hiç farketmez. Çözümünüz hala çalışmıyor . Tüm dizelerin benzersiz olduğu başka bir örneği kolayca bulabilirim, ancak çözümünüz beklenen sonucu vermede başarısız olacak .
katma yazar Mark Byers, kaynak