反转字符串块

2024-10-01 00:15:57 发布

您现在位置:Python中文网/ 问答频道 /正文

编写一个名为reverse\u chunks的函数,该函数接受字符串s和整数k作为参数,并返回一个新字符串,该字符串反转s中每k个字符的相对顺序。例如,reverse\u chunks的调用(“MehranSahami”,3)应一次以3个字符为一组查看字符串,将“Meh”反转为“he\u m”,将“ran”反转为“nar”,以此类推,返回一个“he\u mnarha\u sima”的结果。你知道吗

如果字符串的长度不是k的精确倍数,则字符串末尾少于k个字符的最后一块应保持其原始顺序。例如,如果调用是reverse\u chunks(“MartyStepp”,4),则第一个块“Mart”变为“tra\m”,第二个块“y\u ste”变为“et\u sy”。最后两个字符“pp”少于4个,因此保留原样。所以返回的结果应该是“tra\u met\u sypp”。你知道吗

您可以假设传递给k的值是正整数。你知道吗

约束:不应创建任何数据结构,如数组。但是您可以创建任意多的字符串,也可以使用任意多的简单变量(如int)。你知道吗

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

Tags: 函数字符串lenreturn顺序整数resultchunks
3条回答

你的代码有几个问题,其中最突出的是在循环中修改last,这没有效果。你知道吗

这里有一个变体,我相信它可以满足您的需求(并且至少满足约束条件(reverse_chunks)。你知道吗

请注意,代码可以短得多,但我觉得这更像是一个学习练习,所以我尽量保持它的简单(和可读性)。你知道吗

代码.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.

注意: 正如我在代码中指定的,问题文本中似乎存在一个关于大写字母和下划线的问题。如果是这种情况,则当前结果不正常,您应该:

  • 删除两个注释行之间的代码(在反向块中)
  • 将2个nd一个

在这里它是在一个班轮:

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)的最大倍数处停止。对于k = 3,这意味着我们得到i = 0, 3, 6, 9, ...
  • s[i:i+k]获取从索引i到索引i+k的子字符串—因此,字符串中的下一个k字符。例如,如果i = 0k = 3,则s[i:i+k]返回Meh。如果i = 3,那么它就是ran,依此类推。你知道吗
  • [::-1]应用于iterable,就像我们刚刚生成的字符串一样,是一种很容易反转它的方法(它意味着“从开始到结束,以步长-1进行切片”)。你知道吗

最后,我们使用''.join(...)将这些不同的k字符段缝合回一个整体。你知道吗


如果最后一个段短于k,那么不进行排序就比较困难。但是,您可以在条件中执行此操作:

''.join(s[i:i+k][::-1] if i+k < len(s) else s[i:] for i in range(0, len(s), k))

你在找这样的东西吗?你知道吗

def reverse_chunks(s, k):

    L = [s[i:i+k] for i in range(0, len(s), k)] # this returns ['Meh', 'ran', 'Sah', 'ami']

    result = ""

    for e in L:
        result += e[::-1] # [::-1] reverses any string

    return result

print (reverse_chunks("MehranSahami", 3)) # this returns "heMnarhaSima"

相关问题 更多 >