在 3 的子集中反转字符串的字符
Reverse characters of string in subset of 3
假设我的字符串是:
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'
我想知道实现它的最有效和最pythonic 的方法是什么。
注意:len(x)%3
将始终为 0。
上面的代码可以用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
作为 3 和 range
本身作为:
>>> ''.join(x[i:i+3][::-1] for i in range(0, len(x), 3))
'cbafedihg'
实现此目的的另一种方法是将字符串类型转换为 list
,然后使用 列表切片 简单地交换 list
的元素为 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'
更不用说,如果你想增加一些逻辑或更改逻辑,在这里更改更容易。
假设我的字符串是:
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'
我想知道实现它的最有效和最pythonic 的方法是什么。
注意:len(x)%3
将始终为 0。
上面的代码可以用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
作为 3 和 range
本身作为:
>>> ''.join(x[i:i+3][::-1] for i in range(0, len(x), 3))
'cbafedihg'
实现此目的的另一种方法是将字符串类型转换为 list
,然后使用 列表切片 简单地交换 list
的元素为 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'
更不用说,如果你想增加一些逻辑或更改逻辑,在这里更改更容易。