2013-09-25 4 views
0

У меня есть строка: 1x22x1x. Мне нужно заменить все 1 на 2 и наоборот. Таким образом, пример строки будет 2x11x2x. Просто интересно, как это делается. Я попыталсяЗаменить содержимое строки друг другу

a = "1x22x1x" 
b = a.replace('1', '2').replace('2', '1') 
print b 

выход 1x11x1x

Может быть, я должен забыть об использовании заменить ..?

ответ

1

Один из способов заключается в использовании некоторую временную строку в качестве промежуточной замены:

b = a.replace('1', '@[email protected]').replace('2', '1').replace('@[email protected]', '2') 

Но это может не сработать, если ваша строка уже содержит @[email protected]. Этот метод также описан в PEP 378

+0

Да, это почти прекрасно. Результат дал мне '@ temp_replacex11x @ temp_replacex'. Так что еще нужно что-то сделать. – Waldema

+0

@Waldema. Вы уверены, что получили этот результат? Я получил [правильный результат] (http://ideone.com/IaGY13) –

+0

Положительный, дважды проверенный ..: o Или я просто опечатываю? – Waldema

4

Вот способ, используя метод translate строки:

>>> a = "1x22x1x" 
>>> a.translate({ord('1'):'2', ord('2'):'1'}) 
'2x11x2x' 
>>> 
>>> # Just to explain 
>>> help(str.translate) 
Help on method_descriptor: 

translate(...) 
    S.translate(table) -> str 

    Return a copy of the string S, where all characters have been mapped 
    through the given translation table, which must be a mapping of 
    Unicode ordinals to Unicode ordinals, strings, or None. 
    Unmapped characters are left untouched. Characters mapped to None 
    are deleted. 

>>> 

Заметим, однако, что я написал это для Python 3.x. В 2.x, вам нужно будет сделать это:

>>> from string import maketrans 
>>> a = "1x22x1x" 
>>> a.translate(maketrans('12', '21')) 
'2x11x2x' 
>>> 

Наконец, важно помнить, что метод translate для перестановки символов с другими персонажами. Если вы хотите обменять подстроки, вы должны использовать метод replace, как продемонстрировал Рохит Джайн.

+0

Будет ли это работать, если мы хотим заменить 'abc'' xyz' и 'xyz'' abc'? –

+0

Это как-то возвращает ошибку: TypeError: ожидается объект символьного буфера – Waldema

+0

@Waldema - Извините за задержку - мне не удалось воссоздать вашу ошибку. В конце концов, я понял, что вы должны использовать Python 2.x, потому что ошибка может быть выполнена только таким образом. Я отредактировал мое сообщение для поддержки 2.x. – iCodez

0

Если «источники» все один символ, вы можете создать новую строку:

>>> a = "1x22x1x" 
>>> replacements = {"1": "2", "2": "1"} 
>>> ''.join(replacements.get(c,c) for c in a) 
'2x11x2x' 

IOW, сделать новую строку, используя get метод, который принимает параметр по умолчанию. somedict.get(c,c) означает что-то вроде somedict[c] if c in somedict else c, поэтому, если символ находится в словаре replacements, вы используете соответствующее значение, иначе вы просто используете сам символ.

Смежные вопросы