Как зациклить и подсчитать, у какого игрока больше всего очков?

#python

Вопрос:

  • Pxxx = идентификатор игрока,
  • 1 = победа (счет 1),
  • 0 = проигрыш (счет -1),
  • -1 = не играет (оценка 0),
  • 503 = в игре/игра не закончена (оценка 0)
 player_score = [['P001', '1', '0', '-1', '503', '1'], ['P067', '1', '1', '0', '-1', '503'], ['P218', '0', '1', '1', '-1', '-1'], ['P101', '0', '0', '1', '1', '503'], ['P456', '1', '1', '-1', '1', '-1']]  

Мой код:

 scores_table = {"1" : 1, "0" : -1}  # use the key parameter of max to compute the score res = max(player_score, key=lambda x: sum(scores_table[i] for i in x[1:] if i in scores_table))[0] print(res)  

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

Я хотел бы найти игрока с наибольшим количеством очков и распечатать его идентификатор игрока, общее количество побед и общее количество поражений

Ожидаемый результат:

 The top player is P456 with 3 wins and 0 loses.  

Комментарии:

1. Не могли бы вы поделиться тем, какой код вы пробовали до сих пор

Ответ №1:

IIUC, вы можете найти игрока и использовать Counter , и print вам понравится, что вы хотите:

 gt;gt;gt; from collections import Counter gt;gt;gt; lst_res = next(ps for ps in player_score if ps[0] == res) gt;gt;gt; lst_res ['P456', '1', '1', '-1', '1', '-1']  gt;gt;gt; dct_res = Counter(lst_res) gt;gt;gt; print(f"The top player is {res} with {dct_res.get('1', 0)} wins and {dct_res.get('0',0)} loses") The top player is P456 with 3 wins and 0 loses  

Ответ №2:

 sums = [] for i in player_score:  for j in i[1:]:  score = 0  if j != "503":  score  = int(j)  sums.append(score)  winner = player_score[sums.index(max(sums))][0]  

Ответ №3:

Вы также можете преобразовать счет, количество выигрышей и количество проигрышей в словарь и попытаться получить из него максимальный балл, как показано ниже :-

 player_score = [['P001', '1', '0', '-1', '503', '1'],  ['P067', '1', '1', '0', '-1', '503'],  ['P218', '0', '1', '1', '-1', '-1'],  ['P101', '0', '0', '1', '1', '503'],  ['P456', '1', '1', '-1', '1', '-1']]  DStats = dict()  for player_stats in player_score:  score, wins, loses = 0, 0, 0   for i in player_stats:  if "P" in i:  PID = i  elif i == '1':  wins  = 1  score  = 1  elif i == '0':  loses  = 1  score -= 1  else:  DStats[PID] = (score, wins, loses)  max_score = max([i[0] for i in DStats.values()])  for i in DStats:  if DStats[i][0] == max_score:  print(f"the top player is {i} with {DStats[i][1]} wins and {DStats[i][2]} loses")  

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

Ответ №4:

Попробуйте что-нибудь вроде этого:

 max_player = ["P0",0] for p in player_score:  t_max = 0  for s in p:  if "P" in s or '503' in s:  continue  else:  t_max  = int(s)  if t_max gt; max_player[1]:  max_player[1] = t_max  max_player[0] = p[0]  

Комментарии:

1. ваша max_player переменная должна быть списком, а не кортежем, чтобы вы могли обновлять ее значения. Кортежи не изменчивы.

2. @pySam1459 ты прав, я отредактировал свой ответ.