сортировка списка по номерам из столбца из файла - PullRequest
1 голос
/ 26 февраля 2020

Я в основном использую текстовый файл для хранения результатов, которые будут использоваться с таблицами лидеров. Текстовый файл результатов содержит 3 столбца: имя уровня, имя пользователя, счет.

Это пример из базы данных:

level1, Bobby, 20
level1, connor, 33
level3, connor, 5
level1, Sam , 40
level2, connor, 80
level2, Bobby, 66
level3, Sam, 12
level2, Sam, 10
level3, bobby, 17

Я хочу, чтобы он показывал один уровень за раз. Например: только показать: уровень1, имя пользователя, оценки.

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

f = open("scores.txt", "r")
f1 = f.readlines()    
f.close()
currentlevel = level2

for line in f1:   
    linesplit = line.split(',')
    if linesplit[0] == currentlevel: 
        g.makecentretext(line, white, i, 30)     #Print line basically, just method to print line

Это печатает правильный уровень выключен, но не будет отображать строки в порядке третьего столбца. Я пытался использовать sort(), чтобы это исправить, но это не работает. Может кто-то мне помочь, пожалуйста? спасибо

1 Ответ

2 голосов
/ 26 февраля 2020

Вы можете сохранить свою таблицу лидеров вместо того, чтобы идти построчно, а затем отсортировать ее ключом костюма - сначала по уровню, а затем по счету:

with open("scores.txt") as f:
    leaderboard = [line.strip().split(', ') for line in f]

leaderboard.sort(key=lambda line: (line[0], int(line[2])))

for entry in leaderboard:
    print(*entry)

Это даст:

level1 Bobby 20
level1 connor 33
level1 Sam  40
level2 Sam 10
level2 Bobby 66
level2 connor 80
level3 connor 5
level3 Sam 12
level3 bobby 17

Аналогичным образом, если вы хотите проходить по одному уровню за раз, вы можете filter заполнить список лидеров до определенного уровня c, а затем отсортировать этот уровень:

with open("scores.txt") as f:
    leaderboard = [line.strip().split(', ') for line in f]

currentlevel = 'level2'
level_scores = list(filter(lambda x: x[0] == currentlevel, leaderboard))
# can be also achieved with a simple list-comprehension: 
# level_scores = [entry for entry in leaderboard if entry[0] == currentlevel]
level_scores.sort(key=lambda line: int(line[2]))

for entry in level_scores:
    print(*entry)

И это даст:

level2 Sam 10
level2 Bobby 66
level2 connor 80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...