您的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-loop 并且return
可以替换为
return tournament([match(p1, p2) for p1, p2 in zip(countries[::2], countries[1::2])])
改进完整代码
经过一段时间和 OP 的讨论,这里有一个主要规则的完整代码的重大改进:
- 不要在循环中调用完全相同的方法,在外面做
- 如果方法相同,请不要一次又一次地调用方法,将数据存储在某处