我是一名发布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()这样的预定义函数。有人可以提供任何帮助/建议吗?或者,如果你能看到我做错了什么,你能提供解决方案吗?我不能为我的生活工作
答案 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))]