1

如何反转字符串的“组”(不是列表)?例如,鉴于“组”大小等于 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)

感谢您的任何意见和建议。

4

3 回答 3

2

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

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]
于 2013-07-31T19:26:20.757 回答
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'
于 2013-07-31T19:33:08.887 回答
1

这可以在一行中完成:

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]负责获取每个chunk

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

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

另一种选择是:

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

选择和反转是一步完成的。

于 2013-07-31T19:33:15.780 回答