0

我制作了一个函数'Match',它需要两个国家并根据我的算法返回一个获胜者。
前任)

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

我需要编写函数获胜者,它需要 2^n 个国家的列表并运行锦标赛并找到获胜者。
前任)

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

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

England---France (final)

France (winner) Return value

国家名单的长度不同,我无法制定获胜者选择算法。如果代码使用while循环而不是for循环^^,那就太好了。

4

1 回答 1

0

您的tournament方法应该在连续的玩家对之间进行匹配,因为["a", "b", "c", "d", "e", "f", "g", "h"]它应该是a/b, c/d,e/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-comprehensionfor-loop 并且return可以替换为

return tournament([match(p1, p2) for p1, p2 in zip(countries[::2], countries[1::2])])

改进完整代码

经过一段时间和 OP 的讨论,这里有一个主要规则的完整代码的重大改进:

  • 不要在循环中调用完全相同的方法,在外面做
  • 如果方法相同,请不要一次又一次地调用方法,将数据存储在某处
于 2021-04-11T08:21:05.210 回答