在python列表中循环元素至少一次

2024-04-29 02:04:12 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一段简单的代码:

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)
  • 当只剩下一个玩家的分数为正时,停止迭代
  • 或者当有两个或两个以上的玩家得分为正时,他们中的每一个都至少迭代一次,并且每个人的得分相等

我有一个问题,这些条件,我不知道如何咬他们


Tags: 代码inselfloopforinitdef玩家
1条回答
网友
1楼 · 发布于 2024-04-29 02:04:12

解决方案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名球员,均得分为零:一圈后停止
  • 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

相关问题 更多 >