Список, содержащий сортировку номеров и имен - PullRequest
0 голосов
/ 25 октября 2018

Таким образом, эта программа сохраняет имя и счет, затем сохраняет его в документе tet и сортирует его в пятерку лидеров с оценкой, за которой следует имя.Файл записывается как оценка, имя, оценка, имя ... Но при печати окончательного отсортированного списка он сортирует результаты в виде строк, а не целых чисел, например.98 97 87774 384 111 10000000, а не 10000000 87774 384 111 98 97

#importing os
import os
#checkingn if the file is empty
if os.stat("scores.txt").st_size == 0:
    #if it is, setting up 5 blank scores to correct the ',' start and to 
make the leaderboard more presentable
    f = open('scores.txt','w')
    f.write('0,Empty,0,Empty,0,Empty,0,Empty,0,Empty')
#input of new score and name
score = input('score: ')
name = input('Name: ')
#storing it
f = open('scores.txt','a+')
f.write(',')
f.write(score)
f.write(',')
f.write(name)
f.close()
#reading the file with , as a split so forming a list
f = open('scores.txt','r')
data = f.readline()
# Get and strip all data from the input string.
numdata = [value.strip() for value in data.split(',') if value is not '']
# Create pair from each name/score
data = list(zip(numdata[0::2], numdata[1::2]))
# Sort by score
leaderboard = sorted(data, key =lambda x: x[0], reverse=True)
print(leaderboard)
f.close()

Если кто-нибудь знает, как я могу это исправить, то будет очень признателен

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы также можете применить приведение типа int следующим образом:

data.sort(key=int, reverse=True)

dara[:5].sort(key=int, reverse=True) # for first five

Где данные - это массив строк.

Обратите внимание, что сортировка выполнена, поэтому вы не создаетедругой список в памяти.

0 голосов
/ 25 октября 2018

Чтобы получить 5 лучших результатов, нет необходимости сортировать весь список результатов.Вы можете использовать heapq.nlargest для отслеживания и вывода на верхние n баллов.

Основная проблема, конечно, заключается в том, что вам нужно преобразовать строки в целые числа длясравнение.

from heapq import nlargest

leaderboard = nlargest(5, data, key=lambda x: int(x[0]))

Еще лучше , для начала вы можете преобразовать свои входные данные в целые числа.Вам больше не нужно конвертировать str в int как часть процесса сортировки.Что-то вроде:

from heapq import nlargest
from operator import itemgetter

data = [(int(num), name) for num, nam in zip(numdata[0::2], numdata[1::2])]
leaderboard = nlargest(5, data, key=itemgetter(0))
0 голосов
/ 25 октября 2018

Вы можете преобразовать счет в целое число с помощью конструктора int() в ключевой функции для числовой сортировки результатов:

leaderboard = sorted(data, key =lambda x: int(x[0]), reverse=True)

Если вы хотите только верхнюю 5, вам также следует нарезать ломтиками.результирующий список:

leaderboard = sorted(data, key =lambda x: int(x[0]), reverse=True)[:5]
...