Использование цикла for вместо if, elif? - PullRequest
2 голосов
/ 12 ноября 2011

Я могу начать с того, что я написал:

for player in self.players:
    player.shot()

if self.players[0].best > self.players[1].best and  self.players[2].best:
    self.players[0].wins += 1
    print ("Winner: ", self.players[0].name, "\nResult: ", self.players[0].best)
elif self.players[1].best > self.players[0].best and  self.players[2].best:
    self.players[1].wins+=1
    print("Winner: ", self.players[1].name, "\nResult: ", self.players[1].best)        

Я знаю, как создать цикл, но я не знаю, как его использовать при сравнении значений объекта.Это работает, только если я знаю, сколько игроков, поэтому если там 4 игрока, приведенный выше код будет бесполезен.Как мне написать это в цикле, который возвращает наибольшее из значений self.best?

Ответы [ 4 ]

4 голосов
/ 12 ноября 2011

Pythonic способ сделать это что-то вроде:

bestOfAll = max(p.best for p in self.players)
bestPlayers = [p for p in self.players if p.best == bestOfAll]

if len(bestPlayers) == 1:
    bestPlayer = bestPlayers[0]
    bestPlayer.wins += 1
    print ("Winner: ", bestPlayer.name, "\nResult: ", bestPlayer.best)
elif len(bestPlayers) > 1:
    # More than one player with best score. Resolve a tie?

Первая строка генерирует список best свойств self.players, а затем находит максимум. Следующая строка генерирует список игроков, чьи результаты соответствуют этому лучшему результату. Остальная часть программы печатает результаты. На самом деле нет причин возиться с индексами списков.

0 голосов
/ 12 ноября 2011

Я знаю, как создать цикл, но я не знаю, как его использовать при сравнении значений объекта.

Цикл не имеет ничего общего с проблемой и не имеет отношения к задаче сравнения объектов.

if self.players [0] .best> self.players [1] .best и self.players [2] .best

Логика здесь неправильная: это не естественный язык AND, а логический. Вы описали следующее: «Определите, являются ли self.players[1].best и self.players[2].best оба значения true (отличными от нуля), а затем проверьте, больше ли self.players[0].best, чем значение true / false (1 для true, 0 для false)». Чтобы выполнить оба сравнения, вам придется повторить логику сравнения.

К счастью, вам не нужно или не нужно делать ничего подобного.

Как мне написать это в цикле, который возвращает наибольшее из значений self.best?

Вы не.

Вы говорите «Я хочу наибольшее из значений self.best», а затем используете встроенную функцию Python max (сокращение от «максимум», другое слово для «самый высокий» в контексте). Другие ответы объясняют, как.

0 голосов
/ 12 ноября 2011

Если вы хотите получить игрока с наивысшим best, вы можете использовать max() следующим образом:

bestPlayer = max(self.players, key = lambda p: p.best)
bestPlayer.wins += 1
print ("Winner: ", bestPlayer.name, "\nResult: ", bestPlayer.best)

Но это плохо справляется со связями. Если более двух игроков имеют одинаковые best, это выберет одного из них.

Если вы хотите получить всех игроков, которые имеют самый высокий best, вы можете использовать map() и filter() следующим образом:

best = max(map(lambda p: p.best, self.players))
bestPlayers = filter(lambda p: p.best == best, self.players)
0 голосов
/ 12 ноября 2011
int playerno
int max = 0
foreach player in self.players
if(self.players[player].best > max)
{
playerno = player
max = self.players[player]
}
self.players[playerno].wins++
print ("Winner: ", self.players[playerno].name, "\nResult: ", self.players[playerno].best)

Синтаксис может быть немного неправильным, но вы должны использовать логику.

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