假设我的字符串是:
x = 'abcdefghi'我想在3的子集中反转它,这样我的输出是:
x = 'cbafedihg'即第0指数与第2指数互换,第3指数与第5指数互换,等等。
下面是基于将string转换为list并交换列表中的元素的代码:
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。
发布于 2016-09-14 08:55:17
实现这一目标的另一种方法是将字符串类型转换为list,然后使用步骤as 3使用列表切片交换list的元素,并将字符串列表合并为:
>>> string_list = list(x)
>>> string_list[::3], string_list[2::3] = string_list[2::3], string_list[::3]
>>> ''.join(string_list)
'cbafedihg'发布于 2016-09-14 08:17:58
以上代码可以使用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'基于Delgan的评论,可以进一步简化使用step as 3,range本身为:
>>> ''.join(x[i:i+3][::-1] for i in range(0, len(x), 3))
'cbafedihg'发布于 2016-09-14 09:27:23
编写一个更具可读性和灵活性的函数?
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'更不用说,如果您想要添加更多的逻辑或更改逻辑,这里的更改就更容易了。
https://stackoverflow.com/questions/39485624
复制相似问题