锦标赛冠军 python while loop
tournament winner python while loop
我制作了一个函数 'Match',根据我的算法需要两个国家和 return 个获胜者。
例如)
def Match(England, Brazil) ----> England,
def Match(Mexico, France) ---> France
我需要编写 Winner 函数,它获取 2^n 个国家的列表和 运行 一场锦标赛并找到获胜者。
例如)
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
和 g/h
您可以通过切片和 zip
实现这些
countries[::2]
1 对 2 所以 ["a", "c", "e", "g"]
countries[1::2]
相同但从 1 开始所以 ["b", "d", "f", "h"]
zip
将这 2 个列表配对以创建对手对
保留每场比赛的胜者,并递归调用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)
使用 list-comprehension
for 循环和 return
可以替换为
return tournament([match(p1, p2) for p1, p2 in zip(countries[::2], countries[1::2])])
改进完整代码
经过一段时间与 OP 的讨论后,full code 有了主要规则的重大改进:
- 不要在循环中调用完全相同的方法,在外部调用
- 不要一次又一次地调用相同的方法,将数据存储在某处
我制作了一个函数 'Match',根据我的算法需要两个国家和 return 个获胜者。
例如)
def Match(England, Brazil) ----> England,
def Match(Mexico, France) ---> France
我需要编写 Winner 函数,它获取 2^n 个国家的列表和 运行 一场锦标赛并找到获胜者。
例如)
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
和 g/h
您可以通过切片和 zip
countries[::2]
1 对 2 所以["a", "c", "e", "g"]
countries[1::2]
相同但从 1 开始所以["b", "d", "f", "h"]
zip
将这 2 个列表配对以创建对手对
保留每场比赛的胜者,并递归调用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)
使用 list-comprehension
for 循环和 return
可以替换为
return tournament([match(p1, p2) for p1, p2 in zip(countries[::2], countries[1::2])])
改进完整代码
经过一段时间与 OP 的讨论后,full code 有了主要规则的重大改进:
- 不要在循环中调用完全相同的方法,在外部调用
- 不要一次又一次地调用相同的方法,将数据存储在某处