Замена каждого второго символа в строке в Python - PullRequest
2 голосов
/ 26 октября 2011

У меня следующая проблема: я хотел бы написать функцию на Python, которая, при наличии строки , возвращает строку , где каждая группа из двух символов поменялась местами .

Например, если задано «ABCDEF», возвращается «BADCFE».

Длина строки гарантированно будет четным числом.

Можете ли вы помочь мне, как это сделать в Python?

Ответы [ 6 ]

3 голосов
/ 26 октября 2011

Чтобы добавить еще один параметр:

>>> s = 'abcdefghijkl'
>>> ''.join([c[1] + c[0] for c in zip(s[::2], s[1::2])])
'badcfehgjilk'
2 голосов
/ 26 октября 2011
import re
print re.sub(r'(.)(.)', r'\2\1', "ABCDEF")
1 голос
/ 26 октября 2011
from itertools import chain, izip_longest

''.join(chain.from_iterable(izip_longest(s[1::2], s[::2], fillvalue = '')))

Вы также можете использовать islice s вместо обычных срезов, если у вас очень большие строки или вы просто хотите избежать копирования.

Работает для строк нечетной длины, даже если вопрос не является обязательным.

0 голосов
/ 11 декабря 2015

Вот еще одно простое решение:

"".join([(s[i:i+2])[::-1]for i in range(0,len(s),2)])
0 голосов
/ 26 октября 2011

Если вы предпочитаете однострочники:

''.join(reduce(lambda x,y: x+y,[[s[1+(x<<1)],s[x<<1]] for x in range(0,len(s)>>1)]))
0 голосов
/ 26 октября 2011

Вот отличное решение:

def swapem (s):
    if len(s) < 2: return s
    return "%s%s%s"%(s[1], s[0], swapem (s[2:]))

for str in ("", "a", "ab", "abcdefgh", "abcdefghi"):
    print "[%s] -> [%s]"%(str, swapem (str))

хотя, возможно, не подходит для больших строк: -)

Вывод:

[] -> []
[a] -> [a]
[ab] -> [ba]
[abcdefgh] -> [badcfehg]
[abcdefghi] -> [badcfehgi]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...