2015-04-27 3 views
-3

Таким образом, программа должна найти игрока с самым высоким счетом на каждом уровне. У меня есть текстовый файл с именем playerScores.txt, который имеет имя, оценку и уровень каждой строки. Пример в формате Player:Level:Score:Python: поиск из файла, получение наибольшего числа

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]) 

Это находит номер после второй запятой для каждого уровня, но он находит все числа, а не только самое большое число.

+0

Это не вопрос, а «пожалуйста, делать свою работу бесплатно» нить ... – Antwane

+0

Из комментариев к каждому из ответов, кажется, что вы» просто ищущий рабочий код, который вы можете использовать, даже не пытаясь понять его. – abarnert

ответ

1

Первое, что вам нужно сделать, это преобразовать оценки из строк в числа. Как это:

for line in playerData: 
    sname, slevel, sscore = line.split(",") 
    sscore = int(sscore) 

Обратите внимание, что я только что назвал split один раз вместо 3 раза, и дал содержательные имена результатов, а не просто называть их [1] и так далее.


Если вы используете Python 2.x, что level = input("Game Level?") собирается конвертировать вход на int, так что вам нужно преобразовать каждый slevel в int, а также. Тем не менее, вы действительно, действительно, действительно не должны использовать input в Python 2.x; лучшим решением было бы переключить его на raw_input. Но вы можете конвертировать в int в любом случае, поэтому, если кто-то набирает «Я не знаю, что здесь поставить», они получают ошибку вместо результата. :) Итак, давайте покажем, что:

level = int(raw_input("Game Level?")) # asking for which level 

(. Если вы на самом деле на Python 3.x, оставьте raw_input в 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 

в любом случае, мы не хранить anyth кроме имени/уровня/балла за самый высокий балл, который был обнаружен до сих пор. (В первой версии это явно, во втором мы просто создаем ленивые итераторы и вызываем max, поэтому это происходит неявно.) Это здорово, если вы действительно хотите только один поиск, а затем выйти.

Но если вы собираетесь делать несколько поисков - скажем, вы хотите иметь меню, в котором пользователь может запросить уровень за уровнем, или просто хотите распечатать все рекорды уровней - вы сделали бы лучше преобразовать данные в формат, который упрощает выполнение поиска, как в Kasra's answer.

+0

Это то, что я получаю каждый раз после ввода уровня. Отсутствует Нет -1 –

+0

@OliverBeck: О, это потому, что вы используете 'input' под Python 2.x, который преобразует ваш вход' level' в целое число. Позвольте мне отредактировать ответ. – abarnert

1

Вы можете использовать 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)) 

В предыдущем коде вам цикл по расщепленным линиям и сохранить уровни как ключи словаря и добавьте соответствующую оценку в значение, которое является list ,

И после создания словарного цикла над словарем и печати 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)) 
+0

Если вы собираетесь делать это много раз (как в вашем примере, итерации по всем уровням вместо того, чтобы просто делать один уровень, а затем уходить, как в примере OP), создавая правильную структуру данных, подобную этой, чтобы сделать это легко, безусловно, полезно. – abarnert

+0

@abarnert извините, я не мог понять ваш комментарий !! :) – Kasramvd

+0

@abarnert Но я это, используя линейное решение, лучше, чем мультигенераторный подход выражения с 'max' и ключевой функцией! – Kasramvd

0

Попробуйте прочитать все данные в соответствующих данных состав. Тогда вы можете задать для любого уровня вы хотите:

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)]) 
+0

, если уровень не в рекордах или рекордах [уровень] [1] <результатов: ТипError: unorderable types: int() <_io.TextIOWrapper() –

+0

извините, один 's' слишком много , – Daniel

+0

Извините, если его очевидно, но я не могу его найти, где S слишком много? –

Смежные вопросы