锦标赛冠军python while loop
我制作了一个函数“匹配”,根据我的算法选择两个国家并返回一个获胜者。锦标赛冠军python while loop,python,python-3.x,function,while-loop,tournament,Python,Python 3.x,Function,While Loop,Tournament,我制作了一个函数“匹配”,根据我的算法选择两个国家并返回一个获胜者。 EX) 我需要编写一个函数Winner,它将获得2^n个国家的列表,并运行一个锦标赛,然后找到一个获胜者。 EX) 国家名单的长度各不相同,我无法做出一个赢家选择算法。如果代码使用while loop而不是for loop ^^^,那么匹配将非常好。您的锦标赛方法应该在连续的两对玩家之间进行匹配,因为[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”]应该是a/b、c/d、e/f和g/h 您可以通过切片和zip
EX) 我需要编写一个函数Winner,它将获得2^n个国家的列表,并运行一个锦标赛,然后找到一个获胜者。
EX)
国家名单的长度各不相同,我无法做出一个赢家选择算法。如果代码使用while loop而不是for loop ^^^,那么匹配将非常好。您的
锦标赛
方法应该在连续的两对玩家之间进行匹配,因为[“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”]
应该是a/b
、c/d
、e/f
和g/h
您可以通过切片和zip
以1比2获胜,因此国家[::2]
[“a”、“c”、“e”、“g”]
相同,但从1开始,所以国家[1::2]
[“b”、“d”、“f”、“h”]
将这两个列表配对以创建成对的对手zip
锦标赛
# 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循环和返回
可以替换为
return tournament([match(p1, p2) for p1, p2 in zip(countries[::2], countries[1::2])])
改进完整代码 经过一段时间和与OP的讨论,以下是对主要规则的主要改进:
- 不要在循环中调用完全相同的方法,在外部执行
- 不要一次又一次地调用一个方法,如果它也这样做,请将数据存储在某个地方
匹配
规则一样,您的代码还有很多改进要做,您已经做了很多次相同的事情,而不是1次,来这里,我们将继续努力@태주강 现在就来聊天吧,它起作用了,我终于理解了代码。然而,我正在做一个辅导程序,突然出现了一个超出时间限制的问题。。。哈哈@태주강 时限?我看不出如何改进,它尽可能减少匹配次数,获得时间的唯一方法是使用match
方法,你能编辑你的初始帖子并添加你的match
代码吗?你可以考虑投票支持这个答案,如果你满意,就接受它(左边绿色的勾号)在“锦标赛”方法之前,我实际上有很多代码……整个代码超过100个长度,正如您所说,前面的代码会出现问题@태주강 我已经问过两次了:如果你能把你的match
代码发布到你最初的帖子中,那就太好了。是的,你可以在你的问题帖子上点击“编辑”并添加它(见我在你帖子下的评论,它还包含你帖子的“编辑”链接)
# 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)
return tournament([match(p1, p2) for p1, p2 in zip(countries[::2], countries[1::2])])