比较多个列表并根据列表位置声明获胜者

时间:2015-12-28 19:42:06

标签: python python-3.x

我正在尝试创建一个简单的程序,允许我根据他们的测试结果输入班级中学生的排名位置。将每个学生数据添加到他们自己的列表中,然后将每个学生的总排名位置相加,然后需要将具有最高总排名的位置宣布为获胜者。如果两个或两个以上的学生具有相同的总排名,那么我想检查他们拥有多少顶级排名,并宣布获胜者最多的一个,如果他们是相同的则进入第二名排名等,直到宣布获胜者并且如果它然后不能显示平局。我已经能够创建列表并对它们进行排名,但不进行排名的比较因素。

我的代码到目前为止。

#A list per stud which keeps track of their grades
stud1 = []
stud2 = []
stud3 = []
stud4 = []
stud5 = []

#A list to save all of the studs names
studList = []

#List to keep all of the studs total scores
totalscores = []

#A list to concatenate the studs names and their total scores
stud1name_score =[]
stud2name_score =[]
stud3name_score =[]
stud4name_score =[]
stud5name_score =[]

#Ranked list for stud names and scores.
leaderboard=[]


#Loops 5 times and asks the user to input studs names and saves them to the studList
for i in range(1,6):
            name = input("Please enter the name of student " + str(i) + " ")
            newstud = (name)
            studList.append(newstud)


#Checks if the user has more ballot papers to input, also assigns input value to each studs list
enterMore = "y"
while(enterMore == "y"):

    stud1_grade = int(input("Type in a grade for" + " " +studList[0] ))
    stud1.append(stud1_grade)

    stud2_grade = int(input("Type in a grade for" + " " +studList[1] ))
    stud2.append(stud2_grade)

    stud3_grade = int(input("Type in a grade for" + " " +studList[2] ))
    stud3.append(stud3_grade)

    stud4_grade = int(input("Type in a grade for" + " " +studList[3] ))
    stud4.append(stud4_grade)

    stud5_grade = int(input("Type in a grade for" + " " +studList[4] ))
    stud5.append(stud5_grade)

    enterMore = input("Enter another paper? yes/no ")

print ( stud1, stud2, stud3, stud4, stud5)

#Count of the number of each grade rank the stud has, including ranking the number of 1's, 2's, 3's etc.
stud1_grade1 = stud1.count(1)
stud1_grade2 = stud1.count(2)
stud1_grade3 = stud1.count(3)
stud1_grade4 = stud1.count(4)
stud1_grade5 = stud1.count(5)
stud1_ballot_rank = [stud1_grade1, stud1_grade2, stud1_grade3, stud1_grade4, stud1_grade5]

stud2_grade1 = stud2.count(1)
stud2_grade2 = stud2.count(2)
stud2_grade3 = stud2.count(3)
stud2_grade4 = stud2.count(4)
stud2_grade5 = stud2.count(5)
stud2_ballot_rank = [stud2_grade1, stud2_grade2, stud2_grade3, stud2_grade4, stud2_grade5]

stud3_grade1 = stud3.count(1)
stud3_grade2 = stud3.count(2)
stud3_grade3 = stud3.count(3)
stud3_grade4 = stud3.count(4)
stud3_grade5 = stud3.count(5)
stud3_ballot_rank = [stud3_grade1, stud3_grade2, stud3_grade3, stud3_grade4, stud3_grade5]

stud4_grade1 = stud4.count(1)
stud4_grade2 = stud4.count(2)
stud4_grade3 = stud4.count(3)
stud4_grade4 = stud4.count(4)
stud4_grade5 = stud4.count(5)
stud4_ballot_rank = [stud4_grade1, stud4_grade2, stud4_grade3, stud4_grade4, stud4_grade5]

stud5_grade1 = stud5.count(1)
stud5_grade2 = stud5.count(2)
stud5_grade3 = stud5.count(3)
stud5_grade4 = stud5.count(4)
stud5_grade5 = stud5.count(5)
stud5_ballot_rank = [stud5_grade1, stud5_grade2, stud5_grade3, stud5_grade4, stud5_grade5]

'''
The code below creates 5 new variables one for each stud and sums
their total ballot preferences
'''
stud1total = sum(stud1)
stud2total = sum(stud2)
stud3total = sum(stud3)
stud4total = sum(stud4)
stud5total = sum(stud5)

stud1_ballot_rank.append(studList [0])
stud1_ballot_rank.append(stud1total)
stud2_ballot_rank.append(studList [1])
stud2_ballot_rank.append(stud2total)
stud3_ballot_rank.append(studList [2])
stud3_ballot_rank.append(stud3total)
stud4_ballot_rank.append(studList [3])
stud4_ballot_rank.append(stud4total)
stud5_ballot_rank.append(studList [4])
stud5_ballot_rank.append(stud5total)

overall_rank = [stud1_ballot_rank, stud2_ballot_rank, stud3_ballot_rank, stud4_ballot_rank, stud5_ballot_rank,]



'''
This code adds each studs total ballot preference score to the
totalscores list
'''
totalscores.append(stud1total)
totalscores.append(stud2total)
totalscores.append(stud3total)
totalscores.append(stud4total)
totalscores.append(stud5total)


#Prints out the studs names and their total grades score
print ("The total number of marks for " , studList [0] , "is" , stud1total)
print ("The total number of marks for " , studList [1] , "is" , stud2total)
print ("The total number of marks for " , studList [2] , "is" , stud3total)
print ("The total number of marks for " , studList [3] , "is" , stud4total)
print ("The total number of marks for " , studList [4] , "is" , stud5total)





print(sorted(overall_rank, reverse=True))

2 个答案:

答案 0 :(得分:0)

使用一些功能来帮助你

[(grade,name),(grade,name),...]

将获得学生姓名和成绩,现在只需使用它们来构建student_grades = [(get_grades(name),name) for name in iter(get_student,"")] 的新列表

iter

这可以利用sorted_grades = sorted(student_grades) print (sorted_grades) # just for sanity #then transpose and take the second list (the list of names) sorted_names = zip(*sorted_grades)[-1] print(sorted_names) ,它可以接受一个不接受任何参数的函数,第二个参数充当一个将停止调用该函数的sendinal(简化但基本上就是它)

现在您可以使用python

的常规排序方法对student_grades进行排序
private static int yellow = Color.parseColor("#f9ce1e");
view.setBackgroundColor(yellow);

答案 1 :(得分:0)

您可能希望存储每个成绩的计数,而不是特定成绩。并使用list s(或dict s)获取更多您正在做的事情。例如,如果所有排名均为1-5,则将单个stud_grades映射学生ID #s设为排名计数的list。例如:

studs = []

# Map names to numbers
for i in range(1,6):
    name = input("Please enter the name of student " + str(i) + " ")
    # Store both name and list of ranking counts
    studs.append((name, [0] * 5))

enterMore = "y"
while enterMore == "y":

    for name, rankings in studs:
        rank = int(input("Type in a grade for {}".format(name)))
        rankings[rank] += 1

    enterMore = input("Enter another paper? yes/no ")

# Higher rankings better, and the sum of rankings equals overall rank
studs.sort(key=lambda x: sum(x[0]), reverse=True)

for rank, (name, rankings) in enumerate(studs, start=1):
    print("{} is ranked #{} with total score {}".format(name, rank, sum(rankings)))

这省略了很多代码,但它应该给你一个想法。如果你需要处理X个数字,那么使用一个或多个大小为X的list代替X变量要容易得多,这些变量只在名称中有一个数字(如果你看过那个模式,那么你可能想要list)。