python中的嵌套列表无法通过Lambda格式化,我很难理解为什么

2024-09-29 19:37:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: lambdakeyinmasterforlentable菜单
1条回答
网友
1楼 · 发布于 2024-09-29 19:37:33

您的代码有一些问题

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

>>> 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()

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

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 CLASS\n{'-' * 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]}')

相关问题 更多 >

    热门问题