锦标赛冠军 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/bc/de/fg/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 有了主要规则的重大改进:

  • 不要在循环中调用完全相同的方法,在外部调用
  • 不要一次又一次地调用相同的方法,将数据存储在某处