python中的嵌套列表无法通过Lambda格式化,我正在努力理解为什么



我正在努力让下面的代码发挥作用,我已经格式化了一个表,这样输出看起来更好,但我正在努力能够按列表中的每个索引对数据进行排序。我用菜单来选择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 CLASSn{'-' * 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])

您的代码有一些问题。

您正在打印第一行后对列表进行排序。这不仅可能导致首先显示错误的行(无论哪一行在列表的开头(,而且可能导致打印重复的行,因为列表在循环中已经更改。示例:

>>> l = [2, 1]
>>> for i in l:
...     print(i)
...     l.sort()
... 
2
2

在这里,您可以看到2被打印了两次——一次是因为它是列表中的第一个项目,第二次是因为排序后它现在是第二个项目。重复地对已经排序的列表进行重新排序也是低效的。

更好的方法是在进入循环之前进行一次排序:

for item in sorted(master_list, key=lambda x: x[0]):    # student ID sorter
table()

使用sorted()不会修改原始列表。因此,如果你实际上正在尝试一个多关键字排序(通过依赖于每个稳定排序的累积影响(,那么你应该在每个表转储之前排序一次:

master_list.sort(key=lambda x: x[0])     # student ID key
for item in master_list:
table()
master_list.sort(key=lambda x: x[1])     # student name key
for item in master_list:
table()
# etc. for additional keys

另一个问题是在函数table()中使用全局变量item。最好将项(在这种情况下是一行数据(传递给函数,并为函数使用一个更具描述性的名称:

def print_row(row):
...
for item in sorted(master_list, key=lambda x: x[0]):    # student ID sorter
print_row(item)

您还可以查看可用于指定字段宽度的字符串格式指令。您可以这样做:

def print_row(row):
print(f' {row[0]:9}  : {row[1]:30}  :{row[2]:2}   : {row[3]}')

这使用一个具有字段宽度的fstring来格式化输出。

最后,为什么不使用一个一次性打印整个表格的功能呢?:

def print_table(table):
print(f"{'-' * 60}n{' ' * 20}2021 STUDENT CLASSn{'-' * 60}")
print(f" Student ID | Student Name {' ' * 19}Grade | Course Code")
for row in table:
print(f' {row[0]:9}  : {row[1]:30}  :{row[2]:2}   : {row[3]}')

最新更新