如何反转字符串的"组"(而不是列表)?例如,如果"组"大小等于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)])
其中选择和反转是在一个步骤中完成的。