我正在努力让下面的代码正常工作,我已经格式化了一个表,这样输出看起来更好,但我正在尝试能够按照列表中的每个索引对数据进行排序。我用一个菜单来选择一个lambda选项,但是输出总是一样的。我现在已经把菜单拿出来了,直到我能找出它格式不正确的原因
master_list = [['A53745678', "Charles", 3, 'SOM993'], ['A34345678', "Charles Lob Miester Twidde To", 4, 'SOM555'],
['A54345678', "Tob", 9, 'SOM363'], ['A01245678', "Pob", 10, 'SOM754'], ['A98745678', "Cob", 3, 'SOM343'],
['A64345678', "Fob", 2, 'SOM098'], ['A84245678', "Bob", 1, 'SOM343'], ['A84245678', "Fred", 9, 'SOM999'],
['A12345678', "Alex", 9, 'SOM111']]
def table():
print("", item[0], " " * (9 - len(item[0])), ":", item[1], " " * (30 - len(item[1])), ":", item[2],
" " * (2 - len(str(item[2]))), ":", item[3], " " * (2 - len(item[3])))
print(
f"{'-' * 60}\n{' ' * 20}2021 STUDENT CLASS\n{'-' * 60}")
print(f" Student ID | Student Name {' ' * 19}Grade | Course Code")
for item in master_list: # student ID sorter
table()
master_list.sort(key=lambda x: x[0])
for item in master_list: # Student name sorter
table()
master_list.sort(key=lambda x: x[1])
for item in master_list: # Student Grade Sorter (need to reverse)
table()
master_list.sort(key=lambda x: x[2])
for item in master_list: # Sorting by course code
table()
master_list.sort(key=lambda x: x[3])
您的代码有一些问题
打印第一行后,您将对列表进行排序。这不仅可能导致首先显示错误的行(无论哪一行位于列表的开头),而且还可能导致打印重复的行,因为列表在循环中已更改。例如:
这里您可以看到
2
被打印了两次,一次是因为它是列表中的第一项,第二次是因为排序之后它现在是第二项。对已经排序的列表进行重复重新排序也存在效率低下的问题更好的方法是在进入循环之前进行一次排序:
使用^{} 不会修改原始列表。因此,如果您实际上正在尝试多键排序(通过依赖每个稳定排序的累积影响),那么您应该在每个表转储之前进行一次排序:
另一个问题是在函数
table()
中使用全局变量item
。最好将项(本例中为数据行)传递给函数,并为函数使用更具描述性的名称:您还可以查看可用于指定字段宽度的字符串格式化指令。不必计算填充字段所需的空格数,您可以执行以下操作:
这将使用具有字段宽度的fstring来格式化输出
最后,为什么不使用一个一次性打印整个表的函数呢
相关问题 更多 >
编程相关推荐