使用for循环而不是if,elif?

时间:2011-11-12 14:32:08

标签: python object compare

我可以从我写的内容开始:

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 个答案:

答案 0 :(得分:4)

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属性的列表,然后找到最大值。下一行生成一个其得分与该最佳得分相匹配的玩家列表。程序的其余部分打印结果。确实没有理由搞乱列表索引。

答案 1 :(得分:0)

如果您希望获得最高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)

答案 2 :(得分:0)

  

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

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

  

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

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

幸运的是,你不需要或不想做那样的事情。

  

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

你没有。

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

答案 3 :(得分:-1)

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)

语法可能有些不正确,但您应该参与逻辑。