Цикл элементов в списке python хотя бы один раз - PullRequest
0 голосов
/ 19 июня 2020

Итак, у меня есть простой фрагмент кода:

class Player:
    def __init__(self):
        self.score = 0

players = [Player() for _ in range(10)]

Теперь я хочу:

  • Итерация игроков в списке бесконечно
  • Пропускать игроков с отрицательной оценкой
from itertools import cycle

loop = cycle(players)
loop = filter(lambda player: player.score >= 0, loop)
  • Остановить итерацию, когда остался только один игрок с положительной оценкой
  • Или когда есть два или более игроков с положительной оценкой оценка, каждый из них был повторен хотя бы один раз , и каждый из них имеет одинаковый балл

У меня проблема с этими условиями, и я не знаю, как кусай их.

1 Ответ

0 голосов
/ 19 июня 2020

Решение 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
...