Инвертировать строку в Python по два символа за раз (сетевой порядок байтов) - PullRequest
34 голосов
/ 03 мая 2011

Скажем, у вас есть эта строка:

ABCDEFGH

И вы хотите изменить ее так, чтобы она стала:

GHEFCDAB

Какое было бы наиболее эффективное / питонное решение?Я пробовал несколько разных вещей, но все они выглядят ужасно ...

Заранее спасибо!

Обновление :

На случай, если кому-то интересноэто не для домашней работы.У меня был скрипт, который обрабатывал данные из сетевого захвата и возвращал их в виде строки шестнадцатеричных байтов.Проблема была в том, что данные все еще были в сетевом порядке.Из-за того, как было написано приложение, я не хотел возвращаться и пытаться использовать, скажем, socket.htons, я просто хотел перевернуть строку.

К сожалению, мои попытки казались такими отвратительными, что я знал, что должен быть лучший способ (более питонное решение) - отсюда и мой вопрос.

Ответы [ 14 ]

0 голосов
/ 19 мая 2013

а другой уживается ...

>>> rev = "ABCDEFGH"[::-1]
>>> ''.join([''.join(el) for el in zip(rev[1::2], rev[0::2])])
'GHEFCDAB'
0 голосов
/ 03 мая 2011

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

>>> s = "ABCDEFGH"
>>> ''.join([s[::2][::-1][i]+s[::-2][i] for i in range(len(s[::2]))])
'GHEFCDAB'

Удачи!

0 голосов
/ 03 мая 2011

И еще один способ:

a = "ABCDEFGH"
new = ""

for x in range(-1, -len(a), -2):
    new += a[x-1] + a[x]

print new
0 голосов
/ 03 мая 2011

просто выстрел

st = "ABCDEFGH"
s = [st[2*n:2*n+1] for n in range(len(st)/2)]
return s[::-1].join('')

это предполагает, что len (st) является четным, в противном случае измените его на диапазон (len (st) / 2 + 1), и я даже уверен, что есть лучший способчтобы сделать это, разделите на две части.

Если ваш питон жалуется на s [:: - 1], вы можете использовать обратное (-ые)

...