编写一个名为reverse_chunks的函数,该函数接受字符串s和整数k作为参数,并返回一个新的字符串,该字符串反转s的每k个字符的相对顺序。例如,对reverse_chunks(“ MehranSahami”,3)的调用应一次查看以3个字符为一组的字符串,将“ Meh”反转为“ he_m”,然后将“ ran”转换为“ nar”,依此类推,返回“ he_mnarha_sima”的结果。
如果字符串的长度不是k的整数倍,则字符串末尾少于k个字符的最后一块应保留其原始顺序。例如,如果调用为reverse_chunks(“ MartyStepp”,4),则第一个块“ Mart”变为“ tra_m”,第二个块“ y_ste”变为“ et_sy”。最后两个字符“ pp”小于4,因此保持原样。因此返回的结果应该是“ tra_met_sypp”。
您可以假定为k传递的值将为正整数。
约束:您不应创建任何数据结构,例如数组。但是您可以创建任意数量的字符串,并且可以使用任意数量的简单变量(例如ints)。
(https://www.codestepbystep.com/problem/view/python/strings/reverse_chunks)
def reverse_chunks(s, k):
result= ""
last= -1
for i in range (len(s), last, -1):
if i < len(s):
result+= s[i]
last= int(i) + int(k)
return result
test #1:reverse_chunks("MehranSahami", 3)
expected return:"heMnarhaSima"
your return:"imahaSnarheM"
result: fail
details: incorrect return value
答案 0 :(得分:1)
这里是单线的:
def reverse_chunks(s, k):
return ''.join(s[i:i+k][::-1] for i in range(0, len(s), k))
reverse_chunks("MehranSahami", 3)
# 'heMnarhaSima'
现在,这是单行代码中发生的事情:
range(0, len(s), k)
产生“第k
个值,从0
开始,终止于k
的最大倍数,小于len(s)
。对于{{1 }},这意味着我们得到k = 3
i = 0, 3, 6, 9, ...
从索引s[i:i+k]
开始直到索引i
为止的子字符串-因此,字符串中的下一个i+k
字符。例如,如果k
和i = 0
,则k = 3
返回s[i:i+k]
。如果为Meh
,则为i = 3
,依此类推。ran
应用于类似我们刚刚生成的字符串的可迭代对象是轻松反转它的一种方法(这意味着“从头到尾以长度[::-1]
截取一个切片”)。 最后,我们使用-1
将这些不同的''.join(...)
个字符段缝合成一个整体。
如果要获取 last 段,如果该段比k
短,则很难进行排序。但是,您可以有条件地做到这一点:
k
答案 1 :(得分:0)
正在寻找类似的东西吗?
this.adminService.GetLostOrders().pipe(
mergeMap((orders: any[]) => from(orders).pipe(
mergeMap((order) => from(order.cart.items)),
mergeMap((item) => of(item).pipe(
mergeMap(_ => from(item.players)),
mergeMap(player => this.adminService.adminAVPReg(player.last, player.avp_id).pipe(
map(newPlayer => { player = newPlayer; return player; }))
),
toArray(),
tap(newPlayerArray => item.players = newPlayerArray)
)),
toArray(),
mergeMap(_ => this.adminService.LoadLostOrders(orders))
))
).subscribe();
答案 2 :(得分:0)
您的代码有几个问题,其中最突出的问题是在循环内修改 last ,这没有效果。
我认为这是一个变体,可以满足您的要求(并且还满足约束条件(至少是 reverse_chunks ))。
请注意,代码可以短得多,但是我感觉这更像是一个学习练习,因此我尝试使其保持简单(易读)。
code.py :
#!/usr/bin/env python3
import sys
def reverse_chunks(s, k):
ret = ""
chunks_count, last_chunk_len = divmod(len(s), k)
for i in range(chunks_count):
start_index = i * k
chunk = s[start_index: start_index + k]
# Although it seems that theproblem is poorly written, posting the code as well. If this is the case, simply remocve the following for loop and decomment the line below
for ch in chunk[::-1]:
if "A" <= ch <= "Z":
ret += "_" + ch.lower()
else:
ret += ch
# ret += chunk[::-1]
if last_chunk_len:
ret += s[-last_chunk_len:]
return ret
def main():
for word, k in [
("MehranSahami", 3),
("MartyStepp", 4)
]:
print("'{:s}' reversed ({:d} char long chunks) is '{:s}'".format(word, k, reverse_chunks(word, k)))
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main()
print("\nDone.")
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q056411752]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code.py Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32 'MehranSahami' reversed (3 char long chunks) is 'he_mnarha_sima' 'MartyStepp' reversed (4 char long chunks) is 'tra_met_sypp' Done.
注意: 正如我在代码中还指定的那样,问题的文本似乎存在一个问题,涉及大写字母和下划线。如果是这种情况,则当前结果确定不正确,您应该: