Python:从文件中搜索,获取最大数量

Python:从文件中搜索,获取最大数量,python,Python,因此,程序必须找到每个级别中得分最高的玩家。 我有一个名为playerScores.txt的文本文件,每行都有名称、分数和级别。格式为的示例玩家:级别:分数: Starplayer,1,19 程序必须找到每个级别的最高得分者,因此对于级别1,它必须找到最高的数字。到目前为止,我得到的是: playerData = open("playerScores.txt", "r") #opening file with data level = input("Game Level?") # asking

因此,程序必须找到每个级别中得分最高的玩家。 我有一个名为
playerScores.txt
的文本文件,每行都有名称、分数和级别。格式为
的示例玩家:级别:分数

Starplayer,1,19
程序必须找到每个级别的最高得分者,因此对于级别1,它必须找到最高的数字。到目前为止,我得到的是:

playerData = open("playerScores.txt", "r") #opening file with data
level = input("Game Level?") # asking for which level
for line in playerData: 
    if(line.split(",")[1] == level):
            print(level)
            print(line.split(",")[0])
            print(line.split(",")[2])

这会在每个级别的第二个逗号后查找数字,但会查找所有数字,而不仅仅是最高的数字。

您需要做的第一件事是将分数从字符串转换为数字。像这样:

for line in playerData: 
    sname, slevel, sscore = line.split(",")
    sscore = int(sscore)
请注意,我也只调用了一次
split
,而不是三次,并为结果提供了有意义的名称,而不是只调用它们
[1]
等等


如果您使用的是Python2.x,那么
level=input(“Game level?”)
将把您的输入转换为
int
,因此您还需要将每个
slevel
转换为
int
。然而,你真的,真的,真的不应该在Python2.x中使用
input
;更好的解决方法是将其切换到
raw\u input
。但是您可能希望转换为
int
,因此如果有人键入“我不知道在这里放什么”,他们会得到一个错误,而不是没有结果。:)那么,让我们展示一下:

level = int(raw_input("Game Level?")) # asking for which level
(如果您实际使用的是Python3.x,请将
raw_输入保持为
input
,但仍在其周围添加
int
。)

然后,在循环内部:

    sname, slevel, sscore = line.split(",")
    slevel = int(slevel)
    sscore = int(sscore)

接下来,您可以在前进过程中跟踪最高数字:

hsname, hslevel, hsscore = None, None, -1
for line in playerData: 
    sname, slevel, sscore = line.split(",")
    slevel = int(slevel)
    if slevel == level:
        sscore = int(sscore)
        if sscore > hsscore:
            hsname, hslevel, hsscore = sname, slevel, sscore
然后在最后打印出来:

print(hslevel)
print(hsname)
print(hsscore)

如果您想变得聪明,可以通过将行的iterable转换为三元组的iterable,然后对结果调用
max

triples = (line.strip().split(",") for line in playerData)
level_triples = ((n, l, s) for (n, l, s) in triples if int(l) == level)
highscore = max(triples, key=lambda triple: int(triple[2]))
hsname, hslevel, hsscore = highscore

无论哪种方式,我们都不会存储迄今为止最高分数的名称/级别/分数以外的任何内容。(在第一个版本中,这是显式的;在第二个版本中,我们只是构建惰性迭代器并调用
max
,所以它是隐式的。)如果您真的只想执行一次查找,然后退出,那就太好了


但是如果你要进行多个查找,比如说,你想有一个菜单,用户可以要求一个又一个级别,或者你只想打印出所有级别的高分,你最好将数据转换成一种便于查找的格式,与中一样。

您可以使用
collections.defaultdict
执行以下任务:

from collections import defaultdict
d=defaultdict(list)
playerData = open("playerScores.txt", "r") #opening file with data
level = input("Game Level?") # asking for which level
for line in playerData:
    l=line.split(",") 
    if(l[1] == level):
            d[l[1]].append(int(l[2]))
for i,j in d.items():
   print 'level{}:{}'.format(i,max(j))
在前面的代码中,您在拆分行上循环,并将级别存储为字典的键,并将相关分数附加到其值(即
列表

在字典上创建字典循环并打印分数的
level
max

或者您可以使用
dict.setdefault
方法:

d={}
playerData = open("playerScores.txt", "r") #opening file with data
level = input("Game Level?") # asking for which level
for line in playerData:
    l=line.split(",") 
    if(l[1] == level):
            d.setdefault(l[1],[]).append(int(l[2]))
for i,j in d.items():
   print 'level{}:{}'.format(i,max(j))
另外,作为一种更有效的方式,您可以使用
csv
模块打开文件:

import csv
d={}
with open('eggs.csv', 'rb') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=',')
     for row in spamreader:
        d.setdefault(row[1],[]).append(int(row[2]))

 for i,j in d.items():
     print 'level{}:{}'.format(i,max(j))

尝试读取适当数据结构中的所有数据。然后,您可以要求任何您想要的级别:

highscores = {}
with open("playerScores.txt", "r") as scores:
    for line in playerData:
        player, level, score = line.split(',')
        level = int(level)
        score = int(score)
        if level not in highscores or highscores[level][1] < score:
            highscores[level] = player, score

level = input("Game Level?") # asking for which level
print(highscores[int(level)])
highscores={}
以open(“playerScores.txt”、“r”)作为分数:
对于playerData中的行:
玩家,等级,分数=线。分割(','))
级别=整数(级别)
分数=整数(分数)

如果级别不在高分或高分[级别][1]<分数: 高分[级别]=球员,得分 级别=输入(“游戏级别?”)#询问哪个级别 打印(高分[内部(级别)])
如果您要多次这样做(在您的示例中,迭代所有级别,而不是像OP的示例中那样只做一个级别然后退出),构建这样的正确数据结构以使其变得简单肯定是有用的。@abarnert抱歉,我无法理解您的评论!!:)@abarnert但我认为使用线性解决方案比使用
max
和一个键函数的多生成器表达式方法更好!如何更好?你的解决方案是线性时间,线性空间;我的两个解都是线性时间,常数和常数空间更小。我认为这比我的答案的第一个版本更不适合新手。如果您需要对相同的数据进行大量搜索,那么构建dict是值得的。但是如果你只需要做一次,构建dict只是为了扔掉它是一种浪费。@abarnert是的,你的第一个解决方案是liner,正如我说的,我的意思是在你的最后一个解决方案中使用
生成器表达式
!不仅如此,我指的是上一个解决方案中的所有命令!关于字典,是的,对同一数据进行大量搜索并不有效。这不是一个问题,而是一条“请免费完成我的工作”的线索……从评论到每个答案,似乎你只是在寻找你可以使用的工作代码,而不必试图理解它。如果级别不在高分或高分[级别][1]<分数:类型错误:无序类型:int()<\u io.TextIOWrapper()很抱歉,一个
s
太多了。很抱歉,如果它很明显但我找不到它,那么哪里有太多的呢?它是
scores
,现在是
scores
,一切都正常了。您好,如果我要编辑您编写的程序,它会为级别1-15编写分数,而不是只为输入的级别编写分数。我想通过将输入设置为每个级别,可以将程序粘贴15次,但是会更快吗?非常感谢!!!这是我每次键入级别后得到的结果。没有-1@OliverBeck:哦,那是因为你在Python2.x下使用的是
input
,它将你的
level
输入转换为整数。让我编辑答案。