微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

锦标赛获胜者 python while 循环

如何解决锦标赛获胜者 python while 循环

我创建了一个函数“Match”,它根据我的算法选取两个国家并返回一个获胜者。
EX)

def Match(England,Brazil) ----> England,def Match(Mexico,France) ---> France  

我需要编写一个函数Winner,它获取2^n个国家的列表并运行一场比赛并找到一个获胜者。
EX)

def Winner([England,Brazil,Mexico,France]) ---> France 

England---Brazil,Mexico---France  (Semifinal)

England---France (final)

France (winner) Return value

国家列表的长度不同,我无法制定获胜者选择算法。如果代码使用 while 循环而不是 for 循环 ^^。

解决方法

您的 tournament 方法应该在连续配对的玩家之间进行匹配,对于 ["a","b","c","d","e","f","g","h"],它应该是 a/bc/de/f 和 {{1} }

您可以通过切片和g/h

来实现这些
  • zip 取 1 对 2 所以 countries[::2]

  • ["a","g"] 相同,但从 1 开始,所以 countries[1::2]

  • ["b","h"] 将这 2 个列表配对以创建一对对手

保留每场比赛的获胜者,并与包含一半玩家的下一轮玩家递归调用zip

tournament

使用 # FOR DEMO PURPOSER def match(country_a,country_b): return random.choice([country_a,country_b]) def tournament(countries): n = len(countries) if not ((n & (n - 1) == 0) and n != 0): raise Exception("Size isn't power of 2") if n == 2: return match(*countries) next_round = [] for player1,player2 in zip(countries[::2],countries[1::2]): winner = match(player1,player2) next_round.append(winner) return tournament(next_round) 可以将 for 循环和 list-comprehension 替换为

return

完善完整代码

经过一段时间与 OP 的讨论后,full code 的主要规则有了重大改进:

  • 不要在循环中调用完全相同的方法,而是在循环之外调用
  • 不要一次又一次地调用一个方法,如果它做同样的事情,将数据存储在某处

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。