在文本文件中是否存在一种用于相互切换多行的方法?

问题描述 投票:0回答:2

我需要一种方法/技术来根据球员的得分高低对球员的文本文件进行排序。因此,如果玩家2的得分高于玩家1,则玩家2需要上移到玩家1在文本文件中的位置,反之亦然。这可能吗?

因此,我找到了在文档的每一行上列出不同类别的方式,以便于读取:玩家1、3、2、1玩家2、1、2、3但是我的问题是每个播放器都有4行代码需要切换。我的文本文件如下所示:

player13(*这很重要)21个

player21 *23

  • 因此,假设播放器2播放得很多,并且得分高于播放器1,则文本文档应该看起来像这样

player24(*)32

player13(*这是重要的行)21

  • 因此要澄清;我需要对文档中得分最高的播放器首先写入文本文件的文件进行排序。这样一来,我可以打印出相关的结果排行榜

  • 请注意:我不是在索要代码,而是要使用一种方法/一般示例(或在哪里找到示例)来解决此类问题。 BC我真的很茫然,在我的书和这里看。因此,如果您对此有一个答案,或者知道有相同问题的已回答主题,请对其进行评论,这将对我有很大帮助!

我知道我没有要提供的任何代码,但这是不存在的。我真的只需要一些帮助就可以从哪里开始/指导我使用方法或示例

预先感谢:D

python python-3.x text ranking leaderboard
2个回答
0
投票

[我在这里草绘了如何将乐谱文件解析为按玩家名称索引(排序)的列表的scores列表

scores = []
for line in input_file:
    try:
        score = int(line)
        scores[-1].append(score)
    except ValueError:
        player = line.strip()
        scores.append([player])

重点是

  • 您不知道行中是否包含名称或分数,因此您尝试获取分数(整数值)来转换刚刚读取的字符串...

    • 如果失败(ValueError),那么它是一个名称,您可以将其用作添加到scores]的乐谱列表的起始值

    • 如果确实是分数,则要将其添加到当前分数列表中。

在这一点上,scores类似于[['p1', 3, 2, 4], ['p2', 6, 2, 7], ...],我可以将其余解决方案交到您的手中...


编辑:我对解析分数的最佳数据结构改变了主意……原来的答案仍在修订历史中。

首先,您不能轻易地直接直接修改此类文件。方法是:读取数据,修改数据,写回数据。

我想您可以将数据读入数据结构。例如,在您的情况下,数据可以自然地存储为4元组的列表。每个4元组看起来像这样:

    ("player1", 3, 2, 1)

((您应确保已存储分数的数字,而不是字符串,因为以后需要比较它们。)

假设您已将它们存储在名为player_list的列表中>

接下来,您需要对列表进行排序。您需要的排序键是每个元组中的第二个条目,在Python中,该条目的索引为1(因为编号从0开始)

def sort_key ( tup ): return tup[1]

然后您可以使用此排序键传递给排序功能(请参阅此https://docs.python.org/3/library/stdtypes.html#list.sort。这将对列表进行就地排序:

player_list . sort ( key = sort_key, reverse = True )

((我们需要“反向”以确保顺序是递减的,而不是递增的。)

最后,您需要通过以新顺序再次写出player_list来覆盖文件:

for (player, s1, s2, s3) in player_list:
    write_entry_to_file ( player, s1, s2, s3 ) # use whatever format you need here.

元组注释:

Tuples与列表非常相似,不同之处在于,一旦创建了一个元组,就无法对其进行更改(“不可变”)。要创建元组,请使用括号()而不是方括号[]。

mylist = [2, 4, 6, 8]
mytuple = (2, 4, 6, 8)

您可以用相同的方式将它们编入索引

mylist[0] # returns 2
mytuple[0] # returns 2 too
mylist[1:3] # returns the list [4, 6]
mytuple[1:3] # returns the tuple (4, 6)

并以相同方式附加它们

[2,4] + [6,8]#返回[2,4,6,8](2,4)+(6,8)#返回(2,4,6,8)

空的元组为(),且具有单个元素x的元组为(x,)

在两者之间转换很容易:

list(mytuple)#返回[2,4,6,8]tuple(mylist)#返回(2,4,6,8)


0
投票

首先,您不能轻易地直接直接修改此类文件。方法是:读取数据,修改数据,写回数据。

© www.soinside.com 2019 - 2024. All rights reserved.