Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
锦标赛冠军python while loop_Python_Python 3.x_Function_While Loop_Tournament - Fatal编程技术网

锦标赛冠军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

  • 国家[::2]
    以1比2获胜,因此
    [“a”、“c”、“e”、“g”]

  • 国家[1::2]
    相同,但从1开始,所以
    [“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的讨论,以下是对主要规则的主要改进:

  • 不要在循环中调用完全相同的方法,在外部执行
  • 不要一次又一次地调用一个方法,如果它也这样做,请将数据存储在某个地方

您能分享您的代码吗?你可以分享一个小的CSV例子吗?为了让我了解这些数据,您的所有代码是否都是关于演习规则的强制性代码?就像
匹配
规则一样,您的代码还有很多改进要做,您已经做了很多次相同的事情,而不是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])])