Hướng dẫn python replace multiple characters in list - python thay thế nhiều ký tự trong danh sách

Thay thế hai ký tự

Tôi đã hẹn giờ tất cả các phương thức trong câu trả lời hiện tại cùng với một thêm.

Với một chuỗi đầu vào là abc&def#ghi và thay thế & -> \ & và # -> \ #, cách nhanh nhất là chuỗi các thay thế như thế này: text.replace('&', '\&').replace('#', '\#').

Thời gian cho từng chức năng:

  • a) 1000000 vòng, tốt nhất là 3: 1,47 s mỗi vòng
  • b) 1000000 vòng, tốt nhất là 3: 1,51 s mỗi vòng
  • c) 100000 vòng, tốt nhất là 3: 12,3 s mỗi vòng
  • d) 100000 vòng, tốt nhất là 3: 12 μs mỗi vòng
  • e) 100000 vòng, tốt nhất là 3: 3,27 s mỗi vòng
  • f) 1000000 vòng, tốt nhất là 3: 0,817 s mỗi vòng
  • g) 100000 vòng, tốt nhất là 3: 3,64 s mỗi vòng
  • h) 1000000 vòng, tốt nhất là 3: 0,927 s mỗi vòng
  • i) 1000000 vòng, tốt nhất là 3: 0,814 s mỗi vòng

Dưới đây là các chức năng:

def a(text):
    chars = "&#"
    for c in chars:
        text = text.replace(c, "\\" + c)


def b(text):
    for ch in ['&','#']:
        if ch in text:
            text = text.replace(ch,"\\"+ch)


import re
def c(text):
    rx = re.compile('([&#])')
    text = rx.sub(r'\\\1', text)


RX = re.compile('([&#])')
def d(text):
    text = RX.sub(r'\\\1', text)


def mk_esc(esc_chars):
    return lambda s: ''.join(['\\' + c if c in esc_chars else c for c in s])
esc = mk_esc('&#')
def e(text):
    esc(text)


def f(text):
    text = text.replace('&', '\&').replace('#', '\#')


def g(text):
    replacements = {"&": "\&", "#": "\#"}
    text = "".join([replacements.get(c, c) for c in text])


def h(text):
    text = text.replace('&', r'\&')
    text = text.replace('#', r'\#')


def i(text):
    text = text.replace('&', r'\&').replace('#', r'\#')

Thời gian như thế này:

python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"

Thay thế 17 ký tự

Đây là mã tương tự để làm như vậy nhưng với nhiều ký tự hơn để thoát (\ `*_ {}>#+-.! $):

def a(text):
    chars = "\\`*_{}[]()>#+-.!$"
    for c in chars:
        text = text.replace(c, "\\" + c)


def b(text):
    for ch in ['\\','`','*','_','{','}','[',']','(',')','>','#','+','-','.','!','$','\'']:
        if ch in text:
            text = text.replace(ch,"\\"+ch)


import re
def c(text):
    rx = re.compile('([&#])')
    text = rx.sub(r'\\\1', text)


RX = re.compile('([\\`*_{}[]()>#+-.!$])')
def d(text):
    text = RX.sub(r'\\\1', text)


def mk_esc(esc_chars):
    return lambda s: ''.join(['\\' + c if c in esc_chars else c for c in s])
esc = mk_esc('\\`*_{}[]()>#+-.!$')
def e(text):
    esc(text)


def f(text):
    text = text.replace('\\', '\\\\').replace('`', '\`').replace('*', '\*').replace('_', '\_').replace('{', '\{').replace('}', '\}').replace('[', '\[').replace(']', '\]').replace('(', '\(').replace(')', '\)').replace('>', '\>').replace('#', '\#').replace('+', '\+').replace('-', '\-').replace('.', '\.').replace('!', '\!').replace('$', '\$')


def g(text):
    replacements = {
        "\\": "\\\\",
        "`": "\`",
        "*": "\*",
        "_": "\_",
        "{": "\{",
        "}": "\}",
        "[": "\[",
        "]": "\]",
        "(": "\(",
        ")": "\)",
        ">": "\>",
        "#": "\#",
        "+": "\+",
        "-": "\-",
        ".": "\.",
        "!": "\!",
        "$": "\$",
    }
    text = "".join([replacements.get(c, c) for c in text])


def h(text):
    text = text.replace('\\', r'\\')
    text = text.replace('`', r'\`')
    text = text.replace('*', r'\*')
    text = text.replace('_', r'\_')
    text = text.replace('{', r'\{')
    text = text.replace('}', r'\}')
    text = text.replace('[', r'\[')
    text = text.replace(']', r'\]')
    text = text.replace('(', r'\(')
    text = text.replace(')', r'\)')
    text = text.replace('>', r'\>')
    text = text.replace('#', r'\#')
    text = text.replace('+', r'\+')
    text = text.replace('-', r'\-')
    text = text.replace('.', r'\.')
    text = text.replace('!', r'\!')
    text = text.replace('$', r'\$')


def i(text):
    text = text.replace('\\', r'\\').replace('`', r'\`').replace('*', r'\*').replace('_', r'\_').replace('{', r'\{').replace('}', r'\}').replace('[', r'\[').replace(']', r'\]').replace('(', r'\(').replace(')', r'\)').replace('>', r'\>').replace('#', r'\#').replace('+', r'\+').replace('-', r'\-').replace('.', r'\.').replace('!', r'\!').replace('$', r'\$')

Đây là kết quả cho cùng một chuỗi đầu vào abc&def#ghi:

  • a) 100000 vòng, tốt nhất là 3: 6,72 s mỗi vòng
  • b) 100000 vòng, tốt nhất là 3: 2,64 s mỗi vòng100000 loops, best of 3: 2.64 μs per loop
  • c) 100000 vòng, tốt nhất là 3: 11,9 s mỗi vòng
  • d) 100000 vòng, tốt nhất là 3: 4,92 s mỗi vòng
  • e) 100000 vòng, tốt nhất là 3: 2,96 s mỗi vòng100000 loops, best of 3: 2.96 μs per loop
  • f) 100000 vòng, tốt nhất là 3: 4.29 s mỗi vòng
  • g) 100000 vòng, tốt nhất là 3: 4,68 s mỗi vòng
  • h) 100000 vòng, tốt nhất là 3: 4,73 s mỗi vòng
  • i) 100000 vòng, tốt nhất là 3: 4.24 s mỗi vòng

Và với chuỗi đầu vào dài hơn (## *Something* and [another] thing in a longer sentence with {more} things to replace$):

  • a) 100000 vòng, tốt nhất là 3: 7,59 s mỗi vòng
  • b) 100000 vòng, tốt nhất là 3: 6,54 s mỗi vòng
  • c) 100000 vòng, tốt nhất là 3: 16,9 s mỗi vòng
  • d) 100000 vòng, tốt nhất là 3: 7,29 s mỗi vòng
  • e) 100000 vòng, tốt nhất là 3: 12,2 s mỗi vòng
  • f) 100000 vòng, tốt nhất là 3: 5,38 s mỗi vòng100000 loops, best of 3: 5.38 μs per loop
  • g) 10000 vòng, tốt nhất là 3: 21,7 s mỗi vòng
  • h) 100000 vòng, tốt nhất là 3: 5,7 ss mỗi vòng100000 loops, best of 3: 5.7 μs per loop
  • i) 100000 vòng, tốt nhất là 3: 5,13 s mỗi vòng100000 loops, best of 3: 5.13 μs per loop

Thêm một vài biến thể:

def ab(text):
    for ch in ['\\','`','*','_','{','}','[',']','(',')','>','#','+','-','.','!','$','\'']:
        text = text.replace(ch,"\\"+ch)


def ba(text):
    chars = "\\`*_{}[]()>#+-.!$"
    for c in chars:
        if c in text:
            text = text.replace(c, "\\" + c)

Với đầu vào ngắn hơn:

  • AB) 100000 vòng, tốt nhất là 3: 7,05 s mỗi vòng
  • BA) 100000 vòng, tốt nhất là 3: 2,4 μs mỗi vòng

Với đầu vào dài hơn:

  • AB) 100000 vòng, tốt nhất là 3: 7,71 s mỗi vòng
  • BA) 100000 vòng, tốt nhất là 3: 6.08 s mỗi vòng

Vì vậy, tôi sẽ sử dụng

python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"
0 cho khả năng đọc và tốc độ.

Phụ lục

Được nhắc nhở bởi HACK trong các bình luận, một sự khác biệt giữa

python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"
1 và
python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"
0 là kiểm tra
python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"
3. Hãy kiểm tra chúng so với hai biến thể khác:

def ab_with_check(text):
    for ch in ['\\','`','*','_','{','}','[',']','(',')','>','#','+','-','.','!','$','\'']:
        if ch in text:
            text = text.replace(ch,"\\"+ch)

def ba_without_check(text):
    chars = "\\`*_{}[]()>#+-.!$"
    for c in chars:
        text = text.replace(c, "\\" + c)

Thời gian tính bằng μs trên mỗi vòng trên Python 2.7,14 và 3.6.3 và trên một máy khác với bộ trước đó, do đó không thể so sánh trực tiếp.

╭────────────╥──────┬───────────────┬──────┬──────────────────╮
│ Py, input  ║  ab  │ ab_with_check │  ba  │ ba_without_check │
╞════════════╬══════╪═══════════════╪══════╪══════════════════╡
│ Py2, short ║ 8.81 │    4.22       │ 3.45 │    8.01          │
│ Py3, short ║ 5.54 │    1.34       │ 1.46 │    5.34          │
├────────────╫──────┼───────────────┼──────┼──────────────────┤
│ Py2, long  ║ 9.3  │    7.15       │ 6.85 │    8.55          │
│ Py3, long  ║ 7.43 │    4.38       │ 4.41 │    7.02          │
└────────────╨──────┴───────────────┴──────┴──────────────────┘

Chúng ta có thể kết luận rằng:

  • Những người có séc nhanh hơn 4 lần so với những người không có kiểm tra

  • python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"
    
    4 hơi dẫn đầu trên Python 3, nhưng
    python -mtimeit -s"import time_functions" "time_functions.a('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.b('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.c('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.d('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.e('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.f('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.g('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.h('abc&def#ghi')"
    python -mtimeit -s"import time_functions" "time_functions.i('abc&def#ghi')"
    
    0 (với kiểm tra) có sự dẫn đầu lớn hơn trên Python 2

  • Tuy nhiên, bài học lớn nhất ở đây là Python 3 nhanh hơn 3 lần so với Python 2! Không có sự khác biệt lớn giữa chậm nhất trên Python 3 và nhanh nhất trên Python 2!Python 3 is up to 3x faster than Python 2! There's not a huge difference between the slowest on Python 3 and fastest on Python 2!