如何解决锦标赛获胜者 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/b
、c/d
、e/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 举报,一经查实,本站将立刻删除。