Python:具有不同字符串长度的均匀空间输出数据

Ali*_*lik 6 python python-3.x

我试图让我的输出数据看起来像这样:

-------------------------------------------------------
            Grade Report for Programs 
-------------------------------------------------------
Jacobson, Mark      19.0 <--- 20,17,20
Snurd, Mortimur     16.5 <--- 20,19,18,17,16,15,14,13
Luxemburg, Rosa     15.0 <--- 18,15,20,10,12
Atanasoff, John     20.0 <--- 20,20,20,20,20,20,20
Hopper, Grace       20.0 <--- 20,20,20,20,20,20
-------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理不同的名称长度.我的输出目前看起来像这样.


            Grade Report for Programs 
-------------------------------------------------------
Jacobson, Mark   19.0 <--- 20,17,20
Snurd, Mortimur   16.5 <--- 20,19,18,17,16,15,14,13
Luxemburg, Rosa   15.0 <--- 18,15,20,10,12
Atanasoff, John   20.0 <--- 20,20,20,20,20,20,20
Hopper, Grace   20.0 <--- 20,20,20,20,20,20
-------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

我写的程序是获取成绩分数的输入文件并收集数据并整齐地打印出平均值.

输入文件如下所示:

Mark Jacobson,20,17,20
Mortimur Snurd,20,19,18,17,16,15,14,13
Rosa Luxemburg,18,15,20,10,12
John Atanasoff,20,20,20,20,20,20,20
Grace Hopper,20,20,20,20,20,20
Run Code Online (Sandbox Code Playgroud)

这是我的代码,它收集姓名和分数,并打印出姓氏,名字,平均分数,然后是平均分数的实际分数.

file = input("Enter filename: ")

grade_file = open(file, 'r')

print()

print('---------------------------------------------------------')
print('\t\tGrade Report for Programs')
print('---------------------------------------------------------')

for text in grade_file:
    end_of_name = text.find(',')
    name_seperated = text.find(' ')

    first_name = text[0:name_seperated]
    last_name = text[name_seperated+1:end_of_name]

    name_last_first = last_name + "," + " " + first_name

    grades = text[end_of_name+1:]

    start = 0
    index = 0
    sum_n = 0
    average= 0
    score = 0
    count = 0

    while index < len(grades):
        if grades[index] == ',':
            score = int(grades[start:index])
            count += 1
            sum_n = score + sum_n
            start = index + 1
        index += 1

    count += 1       

    score = int(grades[start:index])
    sum_n = score + sum_n
    average = sum_n / count



    print(name_last_first, " ", average, "<---", grades)


print('---------------------------------------------------------')


grade_file.close()
Run Code Online (Sandbox Code Playgroud)

我只需要弄清楚如何使用偶数空格,这样它就像第一个输出一样产生偶数行和列.非常感谢帮助!谢谢!

Tom*_*zes 6

我发现使用Python的内置C风格格式更简单:

>>> print("%-30s %4.1f" % ("Jacobson, Mark", 19.0))
Jacobson, Mark                 19.0
>>> 
Run Code Online (Sandbox Code Playgroud)

请注意,负字段宽度表示该字段是左对齐的.


Mar*_*ers 5

使用带有字段宽度说明符的字符串格式:

print('{:20s} {:4.1f} <--- {}'.format(name_last_first, average, grades))
Run Code Online (Sandbox Code Playgroud)

这使用带有格式字符串语法str.format()方法将值插入模板。

第一个槽将字符串格式化为20个字符宽的字段,第二个槽将浮点数格式化为4个字符宽的字段,在小数点后使用1位数字(保留小数点本身1加上该点前2位数字)。

如果您是我,我还将查看该csv模块以读取您的数据,而不是使用字符串操作。您将为每个列获取具有单独值的列表对象:

import csv

print('---------------------------------------------------------')
print('\t\tGrade Report for Programs')
print('---------------------------------------------------------')

with open(file, 'r', newline='') as grade_file:
    reader = csv.reader(grade_file)
    for row in reader:
        name = row[0]
        name = ' '.join(map(str.strip, reversed(name.split(',')))
        grades = [int(g) for g in row[1:])
        average = sum(grades) / len(grades)            
        print('{:20s} {:4.1f} <--- {}'.format(name, average, ','.join(grades)))

print('---------------------------------------------------------')
Run Code Online (Sandbox Code Playgroud)