如何从一个外部文本文件中对得分最高的人进行排序,这些人的名字仍然链接在一起?python

如何从一个外部文本文件中对得分最高的人进行排序,这些人的名字仍然链接在一起?python,python,Python,我已经设法将我创建的一个简单骰子游戏中获胜的任何人的分数和姓名写入外部文本文档。我如何对本文档中的最高分进行排序,并将它们与获得该分数的姓名一起显示在控制台上 用于将分数和名称写入文本文档的代码: winners = open("winners.txt", "a") winners.write(p1_username) #writes the name winners.write("\n") winners.write(str(p1_

我已经设法将我创建的一个简单骰子游戏中获胜的任何人的分数和姓名写入外部文本文档。我如何对本文档中的最高分进行排序,并将它们与获得该分数的姓名一起显示在控制台上

用于将分数和名称写入文本文档的代码:

winners = open("winners.txt", "a")
winners.write(p1_username) #writes the name 
winners.write("\n")
winners.write(str(p1_total)) #writes the score
我尝试将数据输入一个元组数组,并在找到时根据每个元组中的数值对它们进行排序,所以我尝试了

count = len(open("winners.txt").readlines(  ))
winners_lst = [(None, None)] * count
f = open("winners.txt", "r")
lines2 = f.readlines()
winners_lst[0][0] = lines2[0]
winners_lst[0][0] = lines2[1]
但这又回来了

TypeError: 'tuple' object does not support item assignment

编辑:我不是问为什么我的解决方案不起作用,我是问我能做些什么来让它起作用或替代解决方案。

元组是不可变的,这意味着一旦创建了元组,就不能修改它。你有两个选择来实现你想要的:

  • 使用大小为2的列表而不是元组,如下所示:
    winners\u lst=[[None,None]]*count
  • 用另一个元组替换元组,如下所示:
    winners\u lst[0]=(lines2[0],lines2[1])

  • 元组是不可变的,这意味着您不能在元组创建后修改它。你有两个选择来实现你想要的:

  • 使用大小为2的列表而不是元组,如下所示:
    winners\u lst=[[None,None]]*count
  • 用另一个元组替换元组,如下所示:
    winners\u lst[0]=(lines2[0],lines2[1])

  • 首先,写入操作应该更干净:

    with open('winners.txt', 'w') as f:
        for p1_username, p1_score in [('foo', 1), ('bar', 2), ('foobar', 0)]:
            print(f'{p1_username}\n{p1_score}', file=f)
    
    winners.txt的内容:

    foo
    1.
    酒吧
    2.
    福巴
    0
    
    然后,您可以将其读回元组列表:

    with open('winners.txt') as f:
        lines = f.read().splitlines()
    
    winners_lst = [(a, b) for a, b in zip(lines[::2], lines[1::2])]
    
    获奖者的内容

    [('foo', '1'), ('bar', '2'), ('foobar', '0')]
    
    摄入后,您可以将分数转换为
    int

    winners_lst = [(a, int(b)) for a, b in winners_lst]
    
    并按分数递减排序(如果这是您的目标):


    首先,写入操作应该更干净:

    with open('winners.txt', 'w') as f:
        for p1_username, p1_score in [('foo', 1), ('bar', 2), ('foobar', 0)]:
            print(f'{p1_username}\n{p1_score}', file=f)
    
    winners.txt的内容

    foo
    1.
    酒吧
    2.
    福巴
    0
    
    然后,您可以将其读回元组列表:

    with open('winners.txt') as f:
        lines = f.read().splitlines()
    
    winners_lst = [(a, b) for a, b in zip(lines[::2], lines[1::2])]
    
    获奖者的内容

    [('foo', '1'), ('bar', '2'), ('foobar', '0')]
    
    摄入后,您可以将分数转换为
    int

    winners_lst = [(a, int(b)) for a, b in winners_lst]
    
    并按分数递减排序(如果这是您的目标):


    元组是一个非常明确的信息:元组是不可变的。不要这样创建列表。创建一个空列表并使用
    append
    元组是不可变的。请参阅(或类似内容)@johnymopp如何创建大小正确、元组类型正确的空列表?您的写入操作在几个方面存在缺陷。得分后似乎没有换行符。另外,使用带有open(…)的
    作为f:
    上下文,以便在使用完资源后正确关闭文件。不要这样创建列表。创建一个空列表并使用
    append
    元组是不可变的。请参阅(或类似内容)@johnymopp如何创建大小正确、元组类型正确的空列表?您的写入操作在几个方面存在缺陷。得分后似乎没有换行符。另外,使用带有open(…)的
    作为f:
    上下文,以便在使用完资源后正确地关闭文件。我不明白什么是
    winners\u lst=[(a,b)对于zip中的a,b(行[::2],行[1::2])]
    的意思,它只是将列表中的每两个元素都连接到元组中吗?是的:在列表理解中,每对连续元素是
    a、b
    ;我们把它们列为元组
    (a,b)
    @baguettio:另请参见更新和一些后续步骤(转换为int,然后排序)。我不明白什么是
    winners\u lst=[(a,b)对于zip中的a,b(行[::2],行[1::2])
    意味着,它只是将列表中的每两个元素连接成元组吗?是的:在列表理解中,每对连续元素是
    a、b
    ;我们将它们列为元组
    (a,b)
    @baguettio:另请参见更新和一些后续步骤(转换为int,然后排序)