2016-10-10 58 views
0

我在格式化下面的字符串时遇到问题。试图保持消息以边界为中心,但难以执行。以下是我想要的输出结果,下面是我迄今为止的代码。注意:我需要在最长行的左列和右列上留出空间,我需要使用split()函数。格式化字符串循环

+---------------+ 
|  STOP!  | 
| DANGER AHEAD | 
| Drive Safely! | 
+---------------+ 

def border_sign(note): 
    letter_count = 0 
    for i in note: 
     letter_count += 1 
     return "+-------+\n| {} |\n+-------+\n".format(note) 
border_sign("STOP\nDANGER AHEAD\nDrive safely!") 
+3

使用这是代码是如何设置完全相同在你的编辑器中?因为你正在回路中。 – idjaw

+1

它也在迭代字符。 – TigerhawkT3

+1

你正在格式化整个'note',并使用一个不做任何事情的计数器,并且不用'i'做任何事情... – TigerhawkT3

回答

2

将字符串拆分为单独的行,然后居中每行。记住要么在函数内立即打印每一行,建立一个列表,或者让每行都行,而不是在第一行之后返回。您还可以确定并使用计算宽度而不是静态值。

def border_sign(note): 
    note = note.splitlines() 
    m = len(max(note, key=len)) 
    yield ('-'*m).join('++') 
    for line in note: 
     yield ("|{:^%d}|" % m).format(line) 
    yield ('-'*m).join('++') 

print(*border_sign("STOP\nDANGER AHEAD\nDrive safely!"), sep='\n') 
+0

感谢您对拆分的解释。如果我正在使用其他测试功能,我将如何去获得正确数量的“+”和“ - ”? –

+0

@AlanWakke - 查看编辑。 '+'不会改变(它只是每个角落中的一个),但是您可以根据最大宽度计算必要的空间和'-'字符。 – TigerhawkT3

1

快速样品来考虑,而不是生产准备代码:

def border_sign(note): 
    rows = note.splitlines() 
    mlen = len(max(rows, key=len)) 
    print "+" + "-" * (2+mlen) + "+" 
    for row in rows: 
     print ("| {:^"+str(mlen)+"} |").format(row) 
    print "+" + "-" * (2+mlen) + "+" 
0
def border_sign(x): 
    splitted = x.splitlines() 
    M = max(map(len,splitted)) 
    horiz = '+-%s-+' % (M*'-') 
    patiz = '| {0: ^%d} |' % M 
    print(horiz,*map(patiz.format,splitted), horiz, sep='\n') 

border_sign("STOP\nDANGER AHEAD\nDrive safely!") 

patiz.format是一个函数,则可以在map