Решение 1
Вот решение, использующее в основном itertools
.
import itertools
positive_players = lambda : filter(lambda player: player.score >= 0, players)
loop = itertools.cycle(positive_players())
if len(list(positive_players())) <= 1:
loop = positive_players()
if len(set([p.score for p in positive_players()])) <= 1:
loop = positive_players()
Некоторые тесты:
- 3 игрока, у всех нулевой счет: стоп после одного l oop.
- 3 игрока с очками [0, 42, 0]: продолжается вечно
- 3 игрока с очками [-1, 42, -2]: останавливается после печати один положительный игрок.
Решение 2
Вот альтернативное решение с использованием генератора.
def loop_players(players):
inx = 0
positive_count = 0
positive_scores = set()
while True:
p = players[inx]
inx += 1
if p.score < 0:
continue
positive_count += 1
positive_scores.add(p.score)
yield p
if inx == len(players):
inx = 0
if positive_count < 2:
break
if len(positive_scores) < 2:
break