对名称和分数进行排序

时间:2014-02-21 14:59:09

标签: python list sorting file-handling

我是一名发布a question here the other day about helping me with my function to sort scores in order的计算机学生,我得到了一些很好的帮助,它现在有效但我也希望根据分数对名称进行排序(所以如果詹姆斯获得10则打印出来“詹姆斯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

得分部分工作正常,我花了很长时间才得到它,我不允许使用像.sort()这样的预定义函数。有人可以提供任何帮助/建议吗?或者,如果你能看到我做错了什么,你能提供解决方案吗?我不能为我的生活工作

2 个答案:

答案 0 :(得分:0)

您不需要使用嵌套循环来浏览两个列表。

由于您应该以完全相同的方式操作这两个列表,因此您应该只使用一个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

进入这个:

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

然后你应该按照你想要的方式对两个列表进行排序。

这会导致错误的唯一时间是你的两个列表的长度不同。如果namelist以某种方式短于scorelist,则此代码将引发异常。您可以通过在排序例程之前检查

来防范这种情况
len(scorelist) == len(namelist)

答案 1 :(得分:0)

想象一下,你有一个返回单个排序列表的函数,例如这是Python中Quicksort algorithm的实现:

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

qsorted_scorelist = qsorted(scorelist)

按照namelist的顺序对scorelist进行排序;你可以使用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))]