【问题标题】:Sort names as well as scores对名称和分数进行排序
【发布时间】:2014-03-23 03:59:38
【问题描述】:

我是一名计算机专业的学生,​​发布了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

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

【问题讨论】:

  • 您需要 2 个列表还是可以将它们合并为一个?
  • @IanAuld 我最初有一个列表,但在这个项目的过程中,我将它分成了两个列表,我更愿意保持这样,因为我理解它,现在去太晚了改变太多东西

标签: python list sorting file-handling


【解决方案1】:

想象一下,您有一个返回单个排序列表的函数,例如这是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进行排序:

qsorted_scorelist = qsorted(scorelist)

按照scorelist的顺序对namelist进行排序;你可以使用Schwartzian transform:

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

请注意 same 函数qsorted() 用于两种情况:将scorelist 一起排序并将两个列表一起排序。您应该尝试将通用功能提取到单独的函数中,而不是针对稍有不同的任务就地修改排序算法。

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

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

【讨论】:

    【解决方案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
    

    进入这个:

        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
    

    那么你应该让两个列表都按照你想要的顺序排序。

    这会导致错误的唯一情况是您的两个列表的长度不同。如果namelistscorelist 短,那么这段代码会抛出异常。你可以通过在你的排序例程之前检查来防止这种情况发生

    len(scorelist) == len(namelist)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2014-01-14
      • 2021-07-06
      相关资源
      最近更新 更多