2013-04-03 3 views
3

Есть более простой способ сделать следующее:Другие способы замены одного символа

def replace(txt,pos,new_char): 
    return txt[:pos] + new_char + txt[pos+1:] 

сделать следующее?

>>> replace('12345',2,'b') 
'12b45' 
+0

Почему наклоняю вы используете заменить? – Harpal

+1

Я не могу придумать ничего лучшего в общем случае. Чего вы пытаетесь достичь именно? –

+1

Обратите внимание, что если вы пишете, чтобы создать лучшую ставку, возможно, вам не нужно создавать новую строку и просто передать отдельные части в 'your_file.write (piece)'. –

ответ

3

Просто испытано несколько решений, чтобы найти лучшую производительность,

Источник тестер код был:

import __main__ 
from itertools import permutations 
from time import time 

def replace1(txt, pos, new_char): 
    return txt[:pos] + new_char + txt[pos+1:] 

def replace2(txt, pos, new_char): 
    return '{0}{1}{2}'.format(txt[:pos], new_char, txt[pos+1:]) 

def replace3(txt, pos, new_char): 
    return ''.join({pos: new_char}.get(idx, c) for idx, c in enumerate(txt)) 

def replace4(txt, pos, new_char):  
    txt = list('12345') 
    txt[pos] = new_char 
    ''.join(txt) 

def replace5(txt, pos, new_char): 
    return '%s%s%s' % (txt[:pos], new_char, txt[pos+1:]) 


words = [''.join(x) for x in permutations('abcdefgij')] 

for i in range(1, 6): 
    func = getattr(__main__, 'replace{}'.format(i)) 

    start = time() 
    for word in words: 
     result = func(word, 2, 'X') 
    print time() - start 

И это результат:

0.233116149902 
0.409259080887 
2.64006495476 
0.612321138382 
0.302225828171 
+0

Ухаживать за поддержкой с некоторыми измерениями? –

+0

@PavelAnossov Я пытаюсь создать одну новую строку вместо двух, Нет? – MostafaR

+0

Нет, он создает строку формата, два среза и результат. Замена OP создает два среза, временный результат конкатенации и результат, так что четыре на четыре. –

1

Не уверен, что " лучше ", но альтернативой является адаптировать что-то вроде следующего:

>>> ''.join({2: 'b', 4: 'x'}.get(idx, c) for idx, c in enumerate(s)) 
'12b4x' 
2

Не уверен, если это проще:

>>> txt = list('12345') 
>>> txt[2] = 'b' 
>>> ''.join(txt) 
'12b45' 
Смежные вопросы