【问题标题】:How to sort students list according to their Marks using Insertion sort in Python如何在 Python 中使用插入排序根据他们的分数对学生列表进行排序
【发布时间】:2021-04-12 21:05:00
【问题描述】:

我正在尝试使用插入排序对学生列表进行排序,并根据他们的分数对每个学生进行排名。学生数据包括姓名、卷号、地址、分数。

在这里,我将学生的 Mark 存储在一个列表中 - Marklist 并将学生的其他数据存储在第二个列表中 - stdData

我使用插入排序对学生标记列表进行了排序。但现在我有 2 个单独的列表。如何合并并打印每个学生的排序列表及其分数?

import csv
stdData = []  # store RollNum,student name last name,address
Marklist = []  # store the final mark of each student
#generallist=[]
with open("studentlist.csv", "r") as f1:
    recordReader = csv.DictReader(f1)
    for row in recordReader:
        #generallist.append(row)
        row['Mark']=int(row['Mark'])
        Marklist.append(row['Mark'])
        stdData.append(row['RollNo'])
        stdData.append(row['Name'])
        stdData.append(row['LastName'])
        stdData.append(row['Address'])
print(Marklist)
print(stdData)
for i in range(1, len(Marklist)):
    key = Marklist[i]
    j = i - 1
    while j >= 0 and key < Marklist[j]:
        Marklist[j + 1] = Marklist[j]
        j -= 1
    Marklist[j + 1] = key

   print("Sorted List: ",Marklist)

谢谢。

【问题讨论】:

    标签: python arrays list csv insertion-sort


    【解决方案1】:

    您非常接近正确的解决方案。答案在于

    • 将学生详细信息存储为列表列表。例如:[ [student1 details], [student2 details], [student3 details] ]
    • 使用MarkList 的索引对stdData 进行排序。

    以下是为解决上述问题而修改的代码:

    import csv
    stdData = []  # store RollNum,student name last name,address
    Marklist = []  # store the final mark of each student
    generallist=[]
    with open("studentlist.csv", "r") as f1:
        recordReader = csv.DictReader(f1)
        for row in recordReader:
            #generallist.append(row)
            row['Mark']=int(row['Mark'])
            Marklist.append(row['Mark'])
            tmp_data = []
            tmp_data.append(row['RollNo'])
            tmp_data.append(row['Name'])
            tmp_data.append(row['LastName'])
            tmp_data.append(row['Address'])
            stdData.append(tmp_data) # Storing student details as list of lists
    print(Marklist)
    print(stdData)
    for i in range(1, len(Marklist)):
        key = Marklist[i]
        data = stdData[i] # Sort the elements in stdData using indices of MarkList
        j = i - 1
        while j >= 0 and key < Marklist[j]:
            Marklist[j + 1] = Marklist[j]
            stdData[j+1] = stdData[j]
            j -= 1
        Marklist[j + 1] = key
        stdData[j+1] = data
    print("Sorted List: ",Marklist)
    for student_data in stdData:
        print(student_data)
    

    尽管上述解决方案给出了正确答案,但它使用了两个列表。

    我们可以使用键对列表进行排序(不必是实际的列表元素)。下面的代码实现了它,是一个更好的解决方案。

    import csv
    stdData = []  # store RollNum,student name last name,address
    
    with open("studentlist.csv", "r") as f1:
        recordReader = csv.DictReader(f1)
        for row in recordReader:
            tmp_data = []
            tmp_data.append(row['RollNo'])
            tmp_data.append(row['Name'])
            tmp_data.append(int(row['Mark']))
            tmp_data.append(row['LastName'])
            tmp_data.append(row['Address'])
            stdData.append(tmp_data) # Storing student details as list of lists
    
    print(stdData)
    for i in range(1, len(stdData)):
        key = stdData[i][2] # here the key is the mark
        data = stdData[i] # we will copy the data to correct index
        j = i - 1
        while j >= 0 and key < stdData[j][2]:
            stdData[j+1] = stdData[j]
            j -= 1
        stdData[j+1] = data
    
    print("Sorted List:")
    for rollno, name, mark, lastname, address in stdData:
        print(rollno, name, mark, lastname, address)
    

    编码愉快。

    【讨论】:

    • RollNo,Name,LastName,Mark,Address 1,Ahmed,Siraj,68,Kabul 2,Siraj,Aswin,78,Kabul 3,Nafas,Aswin,90,Gazni 4,Preety,Rahul, 80,Herat 5,Jan,Aswin,81,Herat 6,Milad,Shreyas,56,Mazar #这是我的 csv 文件
    • 我想我找到了问题所在。我们只需要添加:tmp_data.append(row['Mark'])。将学生的标记添加到 tem_data。这将是想要的答案。
    • @Mina,我已经修改了代码,它更好,因为它只使用一个列表。如果它解决了您面临的问题,您可以接受/支持答案吗?
    • 我已经更新了我的答案。第二个代码块是修改后的代码,它使用了一个列表。
    • 我的错! stdData[j][0] 是一个字符串。应该是stdData[j][2]。我已经更新了解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多