簡體   English   中英

錦標賽冠軍 python while 循環

[英]tournament winner python while loop

我制作了一個 function 'Match',它需要兩個國家並根據我的算法返回一個獲勝者。
前任)

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

我需要編寫 function 獲勝者,其中包含 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]對 2 取 1 所以["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 的討論,這里有一個主要規則的完整代碼的重大改進:

  • 不要在循環中調用完全相同的方法,在外面做
  • 如果方法相同,請不要一次又一次地調用方法,將數據存儲在某處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM