Какой самый простой способ поменять символ в строке с Python? - PullRequest
16 голосов
/ 05 января 2011

Я хочу поменять каждую пару символов в строке. '2143' становится '1234', 'badcfe' становится 'abcdef'.

Как я могу сделать это в Python?

Ответы [ 15 ]

14 голосов
/ 05 января 2011

Oneliner:

>>> s = 'badcfe'
>>> ''.join([ s[x:x+2][::-1] for x in range(0, len(s), 2) ])
'abcdef'
  • s [x: x + 2] возвращает фрагмент строки от x до x + 2; это безопасно для нечетных лин (ов).
  • [:: - 1] переворачивает строку в Python
  • range (0, len (s), 2) возвращает 0, 2, 4, 6 ... в то время как x
10 голосов
/ 05 января 2011

Обычный способ обмена элементами в Python:

a, b = b, a

Так что мне кажется, что вы просто делаете то же самое с расширенным срезом. Это немного сложно, потому что строки не изменяемы, поэтому вам нужно преобразовать их в список, а затем обратно в строку, но я бы сделал следующее:

>>> s = 'badcfe'
>>> t = list(s)
>>> t[::2], t[1::2] = t[1::2], t[::2]
>>> ''.join(t)
'abcdef'
7 голосов
/ 05 января 2011

Вот один из способов ...

>>> s = '2134'
>>> def swap(c, i, j):
...  c = list(c)
...  c[i], c[j] = c[j], c[i]
...  return ''.join(c)
...
>>> swap(s, 0, 1)
'1234'
>>>
2 голосов
/ 10 ноября 2012

Нет необходимости составлять список. Следующие работы для строк четной длины:

r = ''
for in in range(0, len(s), 2) :
  r += s[i + 1] + s[i]
s = r
2 голосов
/ 21 октября 2012

Если производительность или элегантность не являются проблемой, и вы просто хотите ясности и сделаете свою работу, просто используйте это:

def swap(text, ch1, ch2):
    text = text.replace(ch2, '!',)
    text = text.replace(ch1, ch2)
    text = text.replace('!', ch1)
    return text

Это позволяет вам менять или просто заменять символы или подстроку. Например, чтобы заменить 'ab' <-> 'de' в тексте:

_str = "abcdefabcdefabcdef"
print swap(_str, 'ab','de') #decabfdecabfdecabf
2 голосов
/ 05 января 2011
''.join(s[i+1]+s[i] for i in range(0, len(s), 2)) # 10.6 usec per loop

или

''.join(x+y for x, y in zip(s[1::2], s[::2])) # 10.3 usec per loop

или если строка может иметь нечетную длину:

''.join(x+y for x, y in itertools.izip_longest(s[1::2], s[::2], fillvalue=''))

Обратите внимание, что это не будет работать со старыми версиями Python (если я не ошибаюсь старше 2.5).

Тест был выполнен на python-2.7-8.fc14.1.x86_64 и процессоре Core 2 Duo 6400 с s='0123456789'*4.

2 голосов
/ 05 января 2011

Цикл по длине строки по двое и обмен:

def oddswap(st):
    s = list(st)
    for c in range(0,len(s),2):
        t=s[c]
        s[c]=s[c+1]
        s[c+1]=t

    return "".join(s)

дает:

>>> s
'foobar'
>>> oddswap(s)
'ofbora'

и происходит сбой в строках нечетной длины с исключением IndexError.

0 голосов
/ 01 августа 2018
#Think about how index works with string in Python,
>>> a = "123456"
>>> a[::-1]
'654321'
0 голосов
/ 08 февраля 2017
#Works on even/odd size strings
str = '2143657'
newStr = ''
for i in range(len(str)//2):
    newStr += str[i*2+1] + str[i*2]
if len(str)%2 != 0:
    newStr += str[-1]
print(newStr)
0 голосов
/ 13 ноября 2015
def revstr(a):
    b=''
    if len(a)%2==0:
        for i in range(0,len(a),2):
            b += a[i + 1] + a[i]
        a=b
    else:
        c=a[-1]
        for i in range(0,len(a)-1,2):
            b += a[i + 1] + a[i]
        b=b+a[-1]
        a=b
    return b
a=raw_input('enter a string')
n=revstr(a)
print n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...