2015-11-10 3 views
0

Я хотел бы сравнить один элемент списка за другим. Я достиг своей цели, но это не хорошо написанный код. Посмотрите мой код и дайте мне несколько советов. Кстати у меня есть несколько других вопросовPython 3: Сравнение двух элементов из того же списка

players_list = ({'player_name': 'Tom', 
       'player_flag': 'is_human', 
       'player_decision': None, 
       'player_points': 1} 

       {'player_name': 'Peter', 
       'player_flag': 'is_computer', 
       'player_decision': None, 
       'player_points': 2} 

       {'player_name': 'John', 
       'player_flag': 'is_computer', 
       'player_decision': None, 
       'player_points': 0.5} 

       {'player_name': 'Greg', 
       'player_flag': 'is_computer', 
       'player_decision': None, 
       'player_points': 2} 
       ) 

players_list = sorted(players_list, key = lambda k: k['player_points'], reverse = True)) #(1) 

iterator = 0 #(2) 
while players_list[iterator]['player_points'] == players_list[iterator + 1]['player_points']: 
    iterator += 1 

print(' >> The Winner Is...', end = ' ') 
if iterator == 0: 
    print(players_list[0]['player_name'].upper(), '!!!') #(3) 
elif iterator > 0: 
    print('There Is a Draw Between ', end = '') 
    for j in range (0, iterator + 1): 
     print(players_list[j]['player_name'], end = ', ') # (4)) 

    print() # (5) 

(1): Это самый лучший способ в этом случае, чтобы отсортировать мой список по значениям словарей?

(2): Это моя идея сравнить, чтобы решить эту проблему. Не могли бы вы высказать свое мнение и, если понадобится, предложить лучшее решение, пожалуйста?

(3): Какой способ печати в этом случае был бы самым «питоническим»?

print(players_list[0]['player_name'].upper(), '!!!') # 1  
print(%s!!! (players_list[0]['player_name'].upper())) # 2 
print({player_name}!!!.format(player_name = players_list[0] ['player_name']).upper()) # 3 

(4): Как отобразить список игроков в одной строке без ',' в конце?

print(players_list[j]['player_name'], end = ', ') 
>> Peter, Greg, Tom, John, 

(5) Я использовал пустую печать() для отображения «/ n» после отображения игроков в одной строке. Есть ли лучшее решение?

Большое спасибо

+0

Это будет лучше подходит для [Обзор кода] (http://codereview.stackexchange.com/) – Mel

+0

Я собираюсь сделать это, когда у меня будет весь готовый код. Это последняя проблема, которую я знаю, что я должен исправить – mathsicist

+0

Пустой 'print()'? Это не проблема, это абсолютно правильный код. Я не уверен, что вы найдете лучший способ распечатать пустую строку. – Mel

ответ

1

Ваш код не выполняется, когда все игроки имеют одинаковое количество очков.

В любом случае вам не нужно и не хотите сортировать список. Вы хотите отсканировать его, ища элемент (ы) с максимальным количеством точек.

Непроверенные код:

winners = None 
winner_points = None 
for p in players_list: 
    points = p['player_points'] 
    if winner_points is None or winner_points < points: 
     winners = [p] 
     winner_points = points 
    elif winner_points == points: 
     winners.append(p) 

if not winners: 
    print("Nobody played today!") 
elif len(winners) == 1: 
    print("The winner is", winners[0]['player_name']) 
else: 
    print("There is a draw between %d players: %s" % (len(winners), ", ".join(p['player_name'] for p in winners)) 

Кроме того, кодирование стиля:

  • не хранят данные для каждого игрока в хэш. Для этого нужны объекты.
  • не называйте поля player_XXX. player['XXX'] гораздо читабельнее. Использование объектов, т. Е. player.XXX, тем более.
+0

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

+0

Также благодарим за советы. – mathsicist

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