Python 3的子集中字符串的反向字符

Python 3的子集中字符串的反向字符,python,string,python-2.7,python-3.x,slice,Python,String,Python 2.7,Python 3.x,Slice,假设我的字符串为: x = 'abcdefghi' 我想在3的子集中反转它,这样我的输出是: x = 'cbafedihg' i、 第0个索引与第2个索引交换,第3个索引与第5个索引交换,依此类推 下面是我的代码,它基于将字符串转换为列表并交换列表中的元素: 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

假设我的字符串为:

x = 'abcdefghi'
我想在3的子集中反转它,这样我的输出是:

x = 'cbafedihg'
i、 第0个索引与第2个索引交换,第3个索引与第5个索引交换,依此类推

下面是我的代码,它基于将
字符串
转换为
列表
并交换列表中的元素:

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'
我想知道实现这一目标的最有效和最具吸引力的方法是什么


注:
len(x)%3
将始终为0。

可以使用
字符串切片和
列表理解编写上述代码,如下所示:

# 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'
根据的注释,可以使用
步骤
as 3和
范围
本身进一步简化:

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

可以使用
字符串切片
列表理解
编写上述代码,如下所示:

# 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'
根据的注释,可以使用
步骤
as 3和
范围
本身进一步简化:

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

另一种方法是将字符串类型转换为
列表
,然后使用步骤3中的列表切片简单地交换
列表
的元素,并将字符串列表合并为:

>>> string_list = list(x)
>>> string_list[::3], string_list[2::3] = string_list[2::3], string_list[::3]
>>> ''.join(string_list)
'cbafedihg'

另一种方法是将字符串类型转换为
列表
,然后使用步骤3中的列表切片简单地交换
列表
的元素,并将字符串列表合并为:

>>> string_list = list(x)
>>> string_list[::3], string_list[2::3] = string_list[2::3], string_list[::3]
>>> ''.join(string_list)
'cbafedihg'

编写一个可读性更强、更灵活的函数

def get_string(input_str, step=3):
    output = ""
    i = 0
    for _ in list(input_str):
        if i == len(input_str):
            return output
        elif i+step-1 >= len(input_str):
            output += input[len(input_str)-1:i-1:-1]
            return output
        else:
            output += input_str[i+step-1:i:-1] + input_str[i]
            i += step
    return output
下面是灵活的部分:

get_string("abcdefghi")
# Ouputs 'cbafedihg'
get_string("abcdefghi", 2)
# Outputs 'badcfehgi'
get_string("abcdefghi", 5)
# Outputs 'edcbaihgf'

更不用说,如果您想添加更多的逻辑或更改逻辑,在这里更改更容易。

编写一个可读性更强、更灵活的函数

def get_string(input_str, step=3):
    output = ""
    i = 0
    for _ in list(input_str):
        if i == len(input_str):
            return output
        elif i+step-1 >= len(input_str):
            output += input[len(input_str)-1:i-1:-1]
            return output
        else:
            output += input_str[i+step-1:i:-1] + input_str[i]
            i += step
    return output
下面是灵活的部分:

get_string("abcdefghi")
# Ouputs 'cbafedihg'
get_string("abcdefghi", 2)
# Outputs 'badcfehgi'
get_string("abcdefghi", 5)
# Outputs 'edcbaihgf'

更不用说,如果您想添加更多的逻辑或更改逻辑,这里更容易更改。

添加了我可以想到的备选方法作为答案。我仍然有兴趣知道是否有更有效的方法来实现它。补充了我可以想到的替代方法作为答案。我仍然有兴趣知道是否有更有效的方法来实现它。其他替代方法:
“”。join(x[I:I+3][:-1]表示范围(0,len(x),3)内的I)
这显示了使用生成器理解而不是列表理解的优势,这对我来说更具可读性(更少的指示乘法)这与Python3兼容,因为没有进行浮点除法。@Delgan:是的,这也是一个很好的解决方案。我错过了那个。与我在这里提到的第一个解决方案相比,它肯定要干净得多。@Delgan:我应该将其添加为“编辑我的答案”,还是您将其添加为答案?因为,我认为这将有助于其他用户的访问,因此在未来我的替代解决方案不值得自己的响应,更新您的答案似乎是一个好的解决方案。:)更新了它。我相信你值得表扬,所以分享了你个人资料的链接。希望您不介意:)其他选择:
“”。对于范围(0,len(x),3)中的i,join(x[i:i+3][::-1])
这显示了使用生成器理解而不是列表理解的优势,这对我来说更具可读性(更少的指示乘法),并且这与Python 3兼容,因为没有进行浮点除法。@Delgan:是的,这也是一个很好的解决方案。我错过了那个。与我在这里提到的第一个解决方案相比,它肯定要干净得多。@Delgan:我应该将其添加为“编辑我的答案”,还是您将其添加为答案?因为,我认为这将有助于其他用户的访问,因此在未来我的替代解决方案不值得自己的响应,更新您的答案似乎是一个好的解决方案。:)更新了它。我相信你值得表扬,所以分享了你个人资料的链接。希望你不会介意:)