在 Python 中反转字符串"group"



如何反转字符串的"组"(而不是列表)?例如,如果"组"大小等于3,我想将"123456789"转换为"321654987"。

以下是我的代码,但结果是打印空字符串:

string = "12345678901234567890"
new_string = ""
for i in range(0, len(string), 5):
    new_string = new_string + string[i:i+5:-1]
print (new_string)

感谢您的意见和建议。

使用负步长时,也要交换起始值和结束值:

new_string += string[i + 4:i - 1 if i else None:-1]

请注意,结束值被排除在外,None应用于包括第一个字符(-1将再次从结束处切片,因此string[4:-1:-1]将为空)。

演示:

>>> string = "12345678901234567890"
>>> new_string = ""
>>> for i in range(0, len(string), 5):
...     new_string = new_string + string[i + 4:i - 1 if i else None:-1]
... 
>>> new_string
'54321098765432109876'

然而,先切片,然后反转可能更容易,这样就省去了切片的麻烦:

new_string += string[i:i + 4][::-1]

对于您的问题,一个简单的一行代码会是这样的。

>>> from itertools import chain
>>> testString = "123456789"
>>> group = 3
>>> "".join(chain.from_iterable([reversed(elem) for elem in zip(*[iter(testString)]*group)]))
'321654987'

另一个例子->

>>> testString = "12345678901234567890"
>>> group = 5
>>> "".join(chain.from_iterable([reversed(elem) for elem in zip(*[iter(testString)]*group)]))
'54321098765432109876'

这可以在一行中完成:

newline = ''.join([string[i:i+n:1][::-1] for i in range(0, len(string), n)])

其中n是"组"的大小。在你的情况下,应该是3。解释如下:

i in range(0, len(string), n)负责三计数

string[i+i+n:1]负责获取每个区块

[::-1]将反转每个块

''.join()将每个现在反转的块连接回单个字符串。

另一种选择是:

''.join([string[i+n-1:i-1 if i else None:-1] for i in range(0, len(string), n)])

其中选择和反转是在一个步骤中完成的。

最新更新