Saya tidak berpikir bahwa memecahkan batasan ini adalah suatu kebutuhan karena ingin text.replace(('pepper', 'red pepper', 'green pepper'), 'tomato') 3 untuk menangkap text.replace(('pepper', 'red pepper', 'green pepper'), 'tomato') 4 terlihat seperti kasus penggunaan yang sangat jarang, di mana pengganti diambil di atas yang lain, untuk kesempatan langka ini Anda bisa menggabungkan dua penggunaan text.replace(('pepper', 'red pepper', 'green pepper'), 'tomato') 5, juga
Saya pikir ada beberapa implementasi TRIE di PyPI
Saya melihat bagaimana Trie dapat memecahkan masalah ini, tetapi penggunaan memori akan menjadi masalah, dan daftar tertaut tidak dapat menggunakan caching memori berurutan (kompleksitasnya lebih rendah, tetapi runtime bisa lebih besar)
Mungkin sapuan linier yang mirip dengan penerapan penggantian saat ini adalah solusi yang lebih baik
Memiliki str. ganti mendukung banyak target (tetapi dengan satu
penggantian) telah disarankan berkali-kali sebelumnya, dan selalu
kandas karena masalah apa yang harus dilakukan ketika target tumpang tindihtext.replace(('pepper', 'red pepper', 'green pepper'), 'tomato') Kesimpulannya adalah selalu merekomendasikan bahwa jika kebutuhan penggantian Anda
lebih kompleks daripada hanya mengubah satu substring pada satu waktu, Anda
harus pindah ke menggunakan ekspresi reguler
Ide yang Anda kutip sangat berbeda dengan saya, jadi jangan buru-buru menutup ini, berpikir itu adalah hal yang sama
Jika seseorang mengganti teks string, kemungkinan besar hal itu dilakukan lebih dari sekali
Mari bandingkan solusi yang tersedia
Pertimbangkan kami ingin melakukan 3 perubahan pada string text.replace(('pepper', 'red pepper', 'green pepper'), 'tomato') 6
text: str = get_text() changes: List[Tuple[str, str]] = [ (a, b), (c, d), (e, f) ] # Imagine those variables are stringsSolusi umum (sama seperti yang diajarkan @luciano)
Solusi RegEx (disarankan oleh @steven. daprano dan berdasarkan re. sub() dokumentasi)
import re changes: dict[str, str] = dict(changes) def callback_repl(matchobj) -> str: replacement: Optional[str] = changes.get(matchobj.group(0), None) if replacement is not None: return replacement raise Exception('The match object don\'t match!') re.sub(rf'({a}|{c}|{e})', callback_repl, text)Solusi baru yang disarankan
text.replace((a, b), (c, d), (e, f)) _Saya tidak dapat mengeluh tentang solusi pertama, ini berfungsi, satu-satunya alasan saya memposting ini adalah karena menurut saya operasi penulisan banyak penggantian sangat umum dan dapat dioptimalkan
Solusi kedua rumit untuk pekerjaan sederhana yang diselesaikannya, saya dapat melihat orang-orang menyalinnya dari StackOverflow haha, selain bercanda, pemanggilan fungsi menambahkan overhead yang tidak perlu ke algoritme
Hai, solusi lain yang mungkin dapat dilakukan adalah mengimplementasikan algoritme penggantian menggunakan metode find…
Untuk solusi saya, saya mengunduh versi txt dari "El Quijote de la mancha", agar memiliki string yang cukup panjang untuk mengukur waktu
Kemudian saya membuat fungsi menggunakan panggilan bersarang untuk mengganti metode
def multireplace_v1(s, changes): for old, new in changes: s = s.replace(old, new) return sDan fungsi lain menggunakan metode find, dan membuat daftar semua kemungkinan penggantian menggunakan perubahan
def multireplace_v2(s, changes): right = len(s)-1 replacements = [] for old, new in changes: i = 0 l = len(old) while True: n = text_test.find(old, i, right) if n == -1: break i = n + l replacements.append((n, i, l, new)) replacements = sorted(replacements, key= lambda x: x[0]) i = 0 prev_s = -1 prev_e = -1 new_s = "" for b, e, l, t in replacements: if b >= prev_s and b+l <= prev_e: continue prev_s = b prev_e = b+l new_s += s[i:b] + t i = e new_s += s[i:] return new_sPanggilan
result1 = multireplace_v1(text, replace_map)mengambil 3. 06 detik untuk selesai
Dan
text.replace(('pepper', 'red pepper', 'green pepper'), 'tomato') 0mengambil 914ms
Solusi yang diusulkan lebih cepat, dan juga mencegah penggantian string yang sudah diganti, prioritasnya adalah terjadinya salah satu string dalam perubahan