如何使用模数(%)来换行字符

how to use modulo (%) to wrap characters

我正在尝试在 python 中使用 mod,但出了点问题

我的代码:


def wrap(string, max_width):
    result = ''
    for i in range(len(string)):
        result += string[i]
        if i % max_width-1 == 0:
            result += '\n'
    
    return result

if __name__ == '__main__':
    string, max_width = input(), int(input())
    result = wrap(string, max_width)
    print(result)

我的输入:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
4

我的输出:

AB
CDEF
GHIJ
KLMN
OPQR
STUV
WXYZ

但我的预期输出是:

ABCD
EFGH
IJKL
IMNO
QRST
UVWX
YZ

我找不到问题所在,调试器似乎给出了错误的结果 泰

你的数据看起来像这样 4 个循环:

letter      A  B  C  D  E  F  G  H  I  J   K   L   M   N   O ...
index       0  1  2  3  4  5  6  7  8  9  10  11  12  13  14 ...
modulo      0  1  2  3  0  1  2  3  0  1   2   3   0   1   2 ...
mod(idx+1)  1  2  3  0  1  2  3  0  1  2   3   0   1   2   3 ...

所以,当模数等于 max_width-1(此处为 3)时,您想要换行,或者当 modulo(index+1) 等于 0[= 时,可能更容易获得23=]:

def wrap(string, max_width):
    result = ''
    for i in range(len(string)):
        result += string[i]
        if (i+1) % max_width == 0:
            result += '\n'
    
    return result

print(wrap('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 4))

输出:

ABCD
EFGH
IJKL
MNOP
QRST
UVWX
YZ

您可以使用枚举来获取字符及其位置。你 cna 还告诉它从 1 开始,这将使模运算在适当的中断索引上工作:

def wrap(string, max_width):
    result = ''
    for i,c in enumerate(string,1):
        result += c
        if i % max_width == 0:
            result += '\n'        
    return result

或者,您可以使用跨步下标将字符串分解为块,然后 assemble 使用 join:

def wrap(string, width):
    return "\n".join(string[i:i+width] for i in range(0,len(string),width))

或者将逻辑组合成一个提供给连接函数的理解:

def wrap(string, width):
    return "".join(c+"\n"[i%width:] for i,c in enumerate(string,1))