对名字和分数进行排序

2024-09-25 16:21:54 发布

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

我是一个计算机专业的学生,他发了a question here the other day about helping me with my function to sort scores in order,我得到了一些很好的帮助,现在它可以工作了,但我也希望它能根据分数对名字进行排序(所以如果James得到10,它就会打印“James 10”)。现在正在发生的是,分数排序和打印到屏幕上是正确的,但姓名只是按输入的顺序打印。我试过了:

def sortlist():
global scorelist, namelist, hss
namelist = []
scorelist = []
hs = open("hstname.txt", "r")
namelist = hs.read().splitlines()
hss = open("hstscore.txt","r")
for line in hss:
    scorelist.append(int(line))

switched = True
while switched:
    switched = False
    for i in range(len(scorelist)-1):
        for j in range(len(namelist)-1):
            if scorelist[i] < scorelist[i+1]:
                scorelist[i],scorelist[i+1] = scorelist[i+1],scorelist[i]
                namelist[j],namelist[j+1] = namelist[j+1],namelist[j]
                switched = True

score部分工作得很好,我花了很长时间才得到它,而且我不允许使用像.sort()这样的预定义函数。有人能提供任何帮助/建议吗?或者如果你能看出我做错了什么,你能提供一个解决方案吗?我一辈子都解决不了这个问题


Tags: intxttruefor排序lineopensort
2条回答

您不需要使用嵌套循环来遍历这两个列表。在

由于您应该以完全相同的方式操作这两个列表,所以您应该只使用一个for循环,并使用i变量索引到两个列表中。在

如果你转这个:

    for i in range(len(scorelist)-1):
        for j in range(len(namelist)-1):
            if scorelist[i] < scorelist[i+1]:
                scorelist[i],scorelist[i+1] = scorelist[i+1],scorelist[i]
                namelist[j],namelist[j+1] = namelist[j+1],namelist[j]
                switched = True

在这方面:

^{pr2}$

然后你应该把这两个列表按你想要的排序。在

只有当这两个列表的长度不同时才会导致错误。如果namelistscorelist短,则此代码将引发异常。你可以通过在你的分类程序之前检查

len(scorelist) == len(namelist)

想象一下,您有一个函数,它返回一个已排序的列表,例如,Quicksort algorithm在Python中的实现:

def qsorted(L):
    return L and (qsorted([x for x in L[1:] if x < L[0]]) + # lesser items
                  [L[0]] +                                  # pivot
                  qsorted([x for x in L[1:] if x >= L[0]])) # greater or equal

然后您可以使用它对您的scorelist进行排序:

^{pr2}$

要按照scorelist的顺序对namelist进行排序,可以使用Schwartzian transform

qsorted_namelist = [name for score, name in qsorted(zip(scorelist, namelist))]

注意,相同的函数qsorted()在两种情况下都使用:对scorelist进行排序,并将两个列表一起排序。您应该尝试将公共功能提取到单独的函数中,而不是针对稍微不同的任务修改排序算法。在

要测试结果是否正确,可以使用内置的sorted()函数:

 sorted_namelist = [name for score, name in sorted(zip(scorelist, namelist))]

相关问题 更多 >