Я не уверен, как я могу сделать свою программу сортировать и читать из внешнего файла - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю игру в кости в скорлупе с орехами, и результаты сохраняются во внешнем файле с именем 'scores'

Krystian: 5
Adam: 7
Unknown: 2
AWD: 18
Muaadh: 5
Yasir: 6
Zaim: 7
Ishfaq: 5
Tanzeel: 87
Hamzah: 3
Mohammed: 5
Robert: 6
Yasir: 5
Krystian: 61
Natalie: 72

, и это имена пользователей и их оценки.Я видел некоторые алгоритмы сортировки CSV, но проблема в том, что я только начинающий, и я понятия не имею, как они работают, поэтому я не могу их использовать.Что я действительно ищу, так это объяснение того, как отсортировать их от наивысшего балла до наименьшего, и я хочу, чтобы программа распечатала 5 лучших игроков.

with open('scores.txt', newline='') as f:
   data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, delimiter=':', fieldnames=['name', 'score'], quoting=csv.QUOTE_NONE)]

   sorted_data = sorted(data, key = lambda i: i['score'], reverse=True)
   for x in sorted_data:
       print (x['name'] + ': ' + x['score'])

пока это все, что у меня естьудалось "скопировать" из других постов, но это все еще не работает должным образом.Я думаю, что стоит поделиться тем, что когда вы запускаете программу, она спрашивает у пользователя его имя, затем она получает свой счет, затем сохраняет в файл, и в самом конце я спрашиваю пользователя, хотят ли они увидеть 5 лучших игроков.Вот где я хочу, чтобы моя программа сортировала внешний файл и выводила на печать 5 лучших игроков.Я приношу свои извинения, поскольку видел много подобных сообщений, но единственная причина, по которой я публикую это сам, состоит в том, что я действительно не понимаю ни одного из них.Спасибо, что сделали это так далеко.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

У вас есть 80% пути, вам просто нужно выделить 5 лучших оценок, избавиться от ведущих пробелов и преобразовать строки в целые числа.Я бы порекомендовал использовать словарь вместо CSV-файла, но то, что у вас есть, работает.У вас также есть дубликаты в вашем CSV, который с помощью словаря исправит.

with open('scores.txt', newline='') as f:
            # Stripping the leading spaces off of the numbers and names
   data = [{k.strip(): v.strip() for k, v in row.items()} for row in csv.DictReader(f, delimiter=':', fieldnames=['name', 'score'], quoting=csv.QUOTE_NONE)]

                                              # Making the string an integer
   sorted_data = sorted(data, key = lambda i: int(i['score']), reverse=True)
                       # Isolating the top 5 results using indexes.
   for x in sorted_data[:5]:
       print (x['name'] + ': ' + x['score'])
0 голосов
/ 19 сентября 2019

Я думаю, что одной из ваших проблем является использование словаря, который не является последовательным и не поддерживает сортировки.Вместо этого вы можете составить список каждого имени, набрать пару в вашем файле.Сначала поставьте партитуру, а затем вы можете сортировать вызовы в этом списке:

highscores = []

with open('scores.txt') as file_object:
  for line in file_object:
    name, score = line.rstrip().split(':')
    highscores.append ([int(score), name]) 

sorted_scores = sorted(highscores)

Затем, если вы хотите распечатать баллы:

for score, name in sorted_scores:
  print (name + ': ' + str(score))
...