我需要翻译一个关于反转交错字符串的问题,也就是说,我有一对2-pairs(即两组相邻的内容),它们不应该像这样混在一起:
>>> interleaved = "123456"
反编译
>>> print interleaved[::-1]
654321
但实际上我想要的是:
563412
这个问题是否有字符串切片操作?
对于长度为偶数的字符串,可以这样做:
>>> s = "123456"
>>> it = reversed(s)
>>> ''.join(next(it) + x for x in it)
'563412'
>>> s = "7123456"
>>> it = reversed(s)
>>> (s[0] if len(s)%2 else '') + ''.join(next(it) + x for x in it)
'7563412'
zip
:>>> s = "7123456"
>>> (s[0] if len(s)%2 else '') + ''.join(x+y for x, y in zip(s[-2::-2], s[::-2]))
'7563412'
据我所知,最简单的方法是使用正则表达式:
import re
''.join(re.findall('..?', '123456', flags=re.S)[::-1])
这个方法也适用于奇数长度的字符串,而不需要为它们实现单独的逻辑。
例如(使用satomacoto的答案,但不太易读...)
''.join([a[::-1][i:i+2][::-1] for i in range(0, len(a), 2)])
''.join(map(''.join, zip(*[iter(a)]*2))[::-1])
等等。 (a
是您的字符串)。
zip(*[iter(s)]*n)
。How does zip(*[iter(s)]*n)
work in Python? - Grijesh Chauhan
next(it) + x for x in it
吗?我理解next
和 for 循环表达式,但是完整的表达式对我来说有些棘手。 - Grijesh Chauhanreversed
返回一个反向迭代器。在迭代过程中,for循环将在此迭代器上调用next
,但由于我们需要下一个项目,因此在循环内部调用了一个额外的next
来获取下一个项目。因此,在第一次迭代中,x
将获取'6'
,next(x)
将返回'5'
,依此类推... - Ashwini Chaudhary>>> for x in it: next(it) + x
,现在一切都清楚了。谢谢! - Grijesh Chauhanreversed
迭代器知道Unicode字符串,或者您实际上没有翻转Unicode字符串。这些是不同的实体,具有组合字符等需要与仅翻转所有单个字符序列不同处理的特殊情况。 - Lasse V. Karlsen