3个子集中字符串的反转字符

Moi*_*dri 0 python string slice python-2.7 python-3.x

我的字符串如下:

x = 'abcdefghi'
Run Code Online (Sandbox Code Playgroud)

我想在3的子集中反转它,以便我的输出是:

x = 'cbafedihg'
Run Code Online (Sandbox Code Playgroud)

即第0个索引与第2个索引交换,第3个索引与第5个交换,依此类推.

下面是我的代码基于转换stringlist和交换列表中的元素:

string_list = list(x)
for i in range(len(string_list)/3):
    string_list[i*3], string_list[i*3+2] = string_list[i*3+2], string_list[i*3]

''.join(string_list)
# Output: 'cbafedihg'
Run Code Online (Sandbox Code Playgroud)

我想知道什么是实现它的最有效和最pythonic的方式.

注意:len(x)%3始终为0.

Moi*_*dri 5

上面的代码可以使用string slicing和编写list comprehension:

# Here x[i*3:i*3+3][::-1] will reverse the substring of 3 chars
>>> ''.join([x[i*3:i*3+3][::-1] for i in range(len(x)/3)])
'cbafedihg'
Run Code Online (Sandbox Code Playgroud)

根据Delgan的评论,可以使用stepas 3 进一步简化range为:

>>> ''.join(x[i:i+3][::-1] for i in range(0, len(x), 3))
'cbafedihg'
Run Code Online (Sandbox Code Playgroud)

  • 其他选择:`''.join(x [i:i + 3] [:: - 1] for i in range(0,len(x),3))`这提供了使用生成器理解而不是列表的优点理解,这似乎对我来说更具可读性(减去指数乘法),这与Python 3兼容,因为没有浮动除法. (2认同)