如何在打印元组中排列内容

3
我是一个有用的助手,可以为您提供翻译。
我正在尝试将内容排列在元组中,以适应特定的列布局。
示例布局:
PETER PAUL            MALE            100000
MARGARET              FEMALE          1000
MICHAEL JORDAN        MALE            1
AGNES                 FEMALE          200

但是当我遍历元组以打印内容时,它输出:
PETER PAUL            MALE            100000
MARGARET             FEMALE            1000
MICHAEL JORDAN            MALE            1
AGNES            FEMALE            200

当我使用return row时,它只返回第一个tuple而不是全部。我想要返回所有的tuple以便在另一个函数中使用。

以下是代码:

def text():
    rows = (("PETER PAUL", "MALE", "100000"), ("MARGARET ", "FEMALE", "1000"), ("MICHAEL JORDAN", "MALE", "1"),("AGNES", "FEMALE", "200"))

    for row in rows:
       # print("          ".join(row))
        print("".join(row[0]), "".join("          "), "".join(row[1]), "".join("          "), "".join(row[2]))
        #return row

text()

我使用了join方法,但是我找不到ljust方法,我认为它在python3中已经不再可用。


请使用.format()或f-strings。 - Barmar
请问您能否为我演示一下或提供相关文档资料链接? - LAS
你不知道如何查找Python内置函数的文档吗?只需要在谷歌上搜索“python format”即可。 - Barmar
2个回答

4
使用Python的字符串.format()函数,为每个元素指定固定宽度:
def text():
    rows = (("PETER PAUL", "MALE", "100000"), ("MARGARET ", "FEMALE", "1000"), ("MICHAEL JORDAN", "MALE", "1"),("AGNES", "FEMALE", "200"))

    for row in rows:
        print('{:20} {:8} {}'.format(*row))

text()   

给您:

提供给您:

PETER PAUL           MALE     100000
MARGARET             FEMALE   1000
MICHAEL JORDAN       MALE     1
AGNES                FEMALE   200
format()命令的作用是将字符串中每个看到的{}替换为传递给它的参数,在这种情况下为*row*的作用是将row内的三个值扩展为需要被扩展的三个参数。
要返回格式化的文本,您需要先创建一个格式化行的列表,然后使用'\n'.join()将它们全部连接在一起并在末尾加上换行符。
def text():
    rows = (("PETER PAUL", "MALE", "100000"), ("MARGARET ", "FEMALE", "1000"), ("MICHAEL JORDAN", "MALE", "1"),("AGNES", "FEMALE", "200"))

    data = []

    for row in rows:
        data.append('{:20} {:8} {}'.format(*row))

    return '\n'.join(data)

print(text())

这也可以通过使用 Python 的“列表推导式”来实现,代码如下:
def text():
    rows = (("PETER PAUL", "MALE", "100000"), ("MARGARET ", "FEMALE", "1000"), ("MICHAEL JORDAN", "MALE", "1"),("AGNES", "FEMALE", "200"))
    return '\n'.join('{:20} {:8} {}'.format(*row) for row in rows)

print(text())

为什么不使用 return rows - Martin Evans
一旦我在那里加上返回语句,它就不起作用了,它只返回第一个元组。 - LAS
你想要返回所有格式化的文本吗? - Martin Evans
就像终端上打印出来的那样。 - LAS
我已经更新了答案,展示了如何完成这个操作。 - Martin Evans
显示剩余5条评论

0

使用内联格式

def text():
    t = []
    rows = (("PETER PAUL", "MALE", "100000"),  ("MARGARET ", "FEMALE", "1000"), 
            ("MICHAEL JORDAN", "MALE", "1"),   ("AGNES", "FEMALE", "200"))

    for row in rows:
        t.append(f'{row[0]:<30}{row[1]:<10}{row[2]:<20}') 

    return t

for n in text():
    print(n) 

输出:

PETER PAUL                    MALE      100000              
MARGARET                      FEMALE    1000                
MICHAEL JORDAN                MALE      1                   
AGNES                         FEMALE    200    

格式化:

<20 对于字符串不需要,因为左对齐是默认的,如果需要右对齐,请使用>20。有关格式化语言结构的更多信息,请参见链接。


当我使用return时,它只返回第一个元组,如何使其返回所有内容? - LAS
@LAS 已更新为返回所有字符串列表 - 它们没有 \n 结尾,您需要添加它或单独打印字符串。 - Patrick Artner
当我将内容返回另一个函数时,它的输出是 PETER PAUL MALE 100000MARGARET FEMALE 1000MICHAEL JORDAN 而不是在终端中打印的样子。第二个元组如何才能从新行开始呢? - LAS
@Las - 你有看到我的最后一条评论吗?使用 '\n'.join(text())+'\n' 在每行后面添加换行符,或者使用 'linesWithNewlineAtEnd = [f'{x}\n' for x in test()]' 创建包含换行符的列表,或修改 't.append(f'{row[0]:<30}{row[1]:<10}{row[2]:<20}')''t.append(f'{row[0]:<30}{row[1]:<10}{row[2]:<20}\n')' - 尝试理解你复制并修改的解决方案,并根据自己的需求进行修改... - Patrick Artner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接