2015-11-12 2 views
0

Я пишу программу, которая сохраняет последние 3 оценки в текстовом файле для каждого пользователя моей игры. Я уже написал код, который его сохраняет. Теперь я возвращаю данные обратно в программу, которая будет работать с высокими оценками пользователей. У меня также есть баллы, сохраненные в отдельных списках. Все пользователи 1-й балл сохранены в 1 списке всех пользователей. 2-й балл в другом и тот же для 3-го балла. Я пытаюсь поместить их в свой список высоких баллов, поэтому, когда я объединяю списки с именами (в другом списке), я буду сортировать по результату, но будет привязан к имени. пыльник код, который я написал:сравнение элементов списка integers python

for i in range (2): 
     if score1[i] > score2[i] or score1[i]> score3[i]: 
      highscores.append(score1[i]) 
     elif score2[i] > score1[i] or score2[i] > score3[i]: 
      highscores.append(score2[i]) 
     elif score3[i] > score1[i] or score3[i] > score2[i]: 
      highscores.append(score3[i]) 

Кстати это в цикле для г в диапазоне 2, как их в настоящее время только 2 пользователей. Я знаю, что я невероятно глуп, имея или как это означает, что только одно событие должно быть правдой для его работы, но когда я пытался, и он тоже не работал. Пожалуйста, действуйте в соответствии с этими строками, поскольку мой преподаватель сказал: «У меня была правильная идея». Я также надеюсь, что это поможет кому-либо, кто сравнивает элементы списка с целыми числами в python, поскольку я не мог найти что-либо в Интернете. Спасибо, я жду указаний

+0

'или' вы уверены? – njzk2

+2

(вам может понадобиться нечто вроде 'highscores = map (max, zip ([1,2,3], [3,5,2], [2,7,1]))) – njzk2

+0

@ njzk2: Да, это лучший подход, если существующий код (который сохраняет высокие баллы, сравнивая индивидуальные баллы для каждого пользователя в порядке) является правильным. Это не кажется правильным, хотя (логика OP ошибочна, вы просто зеркалируете ее), поскольку, по-видимому, высокие баллы должны быть полными высокими баллами (как написано, ваши «рекорды» будут '[3, 7, 3]' , хотя три самых высоких показателя были бы «[7, 5, 3]»). – ShadowRanger

ответ

2
  1. Вы хотите использовать and, не or.
  2. Вы также можете использовать синтаксис a < b < c вместо and.
  3. Что вы действительно должны сделать, это использовать встроенную функцию max Python. Чистый однострочный блок вместо этого 6-строчного блока if-elif.

    highscores.append(max(score1[i], score2[i], score3[i])) 
    
+0

Как и комментарий @ njzk2, это отражает то, что пытался сделать код OP, но, вероятно, это не правильная логика; если пользователь получил оценки '[1,2,3]', а другой пользователь получил '[2,3,4]' (мы предположим, что третий пользователь получил нулевые оценки), тогда он предоставит вам вывод ' [2,3,4] ', даже если первый пользователь получил« 3 »с третьей попытки, а общие верхние оценки должны быть« [4, 3, 3] ». – ShadowRanger

+0

эта линия highscores.append (max (оценка 1 [i], score2 [i], score3 [i])) действительно помогли –

1

Вероятно, не допускается для этого задания, но и для тех, кому необходимо сделать что-то подобное, легкий/быстрый способ выбрать лучшие 3 значения из большой последовательности значений является использование heapq.nlargest. Если у вас несколько последовательностей, вы можете itertools.chain их избежать, чтобы избежать объединения (избегайте увеличения использования пиковой памяти). Вы даже можете прикрепить имена (с zip и itertools.repeat) для каждой входной последовательности таким образом, выбранные высокие оценки включают в себя соответствующий пользователь:

from heapq import nlargest 
from itertools import chain, repeat 

highscores = nlargest(3, chain(zip(score1, repeat('user1')), 
           zip(score2, repeat('user2')), 
           zip(score3, repeat('user3')))) 

highscores бы тогда list с тремя элементами (от самых высоких до самых низких Score, связей сломанное по имени пользователя), причем каждый элемент является tuple формы (score, username).

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