【问题标题】:Using a for loop instead of if,elif?使用 for 循环而不是 if,elif?
【发布时间】:2011-11-12 14:32:08
【问题描述】:

我可以从我写的开始:

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 值的循环中编写这个?

【问题讨论】:

  • 我不认为您的比较符合您的要求。例如。 self.players[0].best > self.players[1].best and self.players[2].best(self.players[0].best > self.players[1].best) and self.players[2].best;即self.players[2].best 被视为True(非零)或False(零)。
  • 认为这就是你想要缩进的意思,但这真的很难说。空格在 Python 中很重要。请尽量保持一致。
  • 我知道这是不正确的,但我想因为无论如何我都会改变它。谢谢!

标签: python object compare


【解决方案1】:

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?

第一行生成self.playersbest 属性列表,然后找到最大值。下一行生成一个得分与最佳得分相匹配的玩家列表。程序的其余部分打印结果。真的没有任何理由去搞乱列表索引。

【讨论】:

    【解决方案2】:

    如果你想得到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)
    

    【讨论】:

    • 这很好用。我实际上使用 lambda 函数对结果进行排序,不知道你可以这样使用它。仍然在学习。非常感谢!
    • 如果您认为某个答案确实回答了您的问题,您应该点击绿色的勾号接受它。您还应该为您认为好的答案投票。
    【解决方案3】:

    我知道如何创建循环,但在比较对象值时我不知道如何使用它。

    循环与问题无关,与比较对象的任务无关。

    如果 self.players[0].best > self.players[1].best 和 self.players[2].best

    这里的逻辑是错误的:这不是自然语言 AND,而是逻辑 AND。您所描述的是:“确定self.players[1].bestself.players[2].best 是否都为真(非零),然后检查self.players[0].best 是否大于该真/假值(1 为真,0 为假)”。要进行这两种比较,您必须重复比较逻辑。

    幸运的是,您不需要或不想做这样的事情。

    我如何在一个循环中编写这个返回最高的 self.best 值?

    你没有。

    你说“我想要最高的 self.best 值”,然后使用内置的 Python 函数max(“最大值”的缩写,上下文中“最高”的另一个词)。其他答案解释了如何。

    【讨论】:

    • a < b and c 等于 (a < b) and c,而不是你说的 a < (b and c)
    • 混淆它。当然,这代表同样不合逻辑的事情:)
    • @yak: 运算符的优先级在这里几乎不重要 - 将数字 c (self.players[2].best) 视为布尔值的不合逻辑等同于进行数值比较的不合逻辑"a < boolean" . OP 的原始声明,如果被解读为英文句子而不是 Python 代码,显然是打算在进行比较之前对 b 和 c 进行分组。
    • 我发帖后就意识到循环不是问题,但正如你所说,其他人解释得很好:)
    【解决方案4】:
    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)
    

    语法可能有点不正确,但你应该了解其中的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多