2015-12-14 17 views
1

我有一個列表的列表:在季後賽括號消除團隊使用Python

playoffTeamList = [[adSeed1, adSeed4], [adSeed2, adSeed3], 
        [mdSeed1, mdSeed4], (mdSeed2, mdSeed3], 
        [cdSeed1, cdSeed4], (cdSeed2, cdSeed3], 
        [pdSeed1, pdSeed4], (pdSeed2, pdSeed3]] 

它的運動隊是取得了附加賽(即非霍奇金淋巴瘤或NBA式的淘汰賽格式,最好的7輪)的列表。列表中的每個列表都是在第一輪中將面對的團隊對。冠軍將有4輪冠軍。

我想要做的是從每一對中刪除失去的球隊並重新排列較大的列表,以便在迭代過程中將獲勝者重新包圍(或重新連接),以便下一輪看起來像:

playoffTeamList = [[adSeed1, adSeed2], 
        [mdSeed1, mdSeed2], 
        [cdSeed1, cdSeed2], 
        [pdSeed1, pdSeed2]] 

和下一輪:

playoffTeamList = [[adSeed1, mdSeed1], 
        [cdSeed1, pdSeed2]] 

然後

playoffTeamList = [[adSeed1, pdSeed2]] 

我的ID EA是剛剛從每個列表中刪除失敗的隊伍:

for brackets in playoffTeamList: 
    playoffScoring() # This is an algorithm that plays each game of each best of seven round and returns a winner and/or loser 
    brackets.remove(brackets[0]) 

print playoffTeamList 

我不能完全弄清楚,使優勝隊伍保持並重新括號如何重新安排大名單。壓縮或壓縮解壓縮似乎並沒有讓我在那裏。也許我只是缺少一種方法或功能,允許我這樣做。

另外,我很樂意提供關於如何設置我的列表的其他建議,以便在每輪迴歸優勝者並重新安排下一輪時更優雅。也許是一本字典?也許別的東西?

+1

就像一個供參考,從當前迭代的序列中刪除一些東西通常是一個壞主意。閱讀關於爲什麼[這裏](http://stackoverflow.com/questions/31704066/floats-not-evaluating-as-negative-python#answer-31704332) – IanAuld

回答

2
def playoffScoring(team1, team2): 
    return team1 # replace with actual scoring function 

def games_round(games): 
    winners = [] 
    for team1, team2 in games: 
     winning_team = playoffScoring(team1, team2) 
     winners.append(winning_team) 

    return winners 

def plan_games(teams): 
    return zip(teams[::2], teams[1::2]) 

teams = [1, 2, 3, 4, 5, 6, 7, 8] 
round = 0 
while len(teams) > 1: 
    round += 1 
    print "Round {}: teams: {}".format(round, teams) 
    games = plan_games(teams) 
    teams = games_round(games) 

champion = teams[0] # only one left 
print "Champion is {}".format(champion) 

的奇妙之處在於plan_games功能 - zip有兩個iterables然後將它們逐元素,爲了。 [::2][1::2]是列表切片 - 很好地解釋了其他SO question

+0

這太棒了。謝謝@ J0HN。我能夠接受並修改它以供我使用。感謝您也投入印刷線路。使打印出來看起來不錯。 – Mike

2

一個簡單的方法是循環遍歷它們並在每一輪結束時創建一個新列表。

# Iterate through each round 
for round in xrange(num_rounds): 
    winners = [] 

    # Make a list of only the winners in each round 
    for playoff in playoffTeamList: 
     # Run your algo 
     winner_index = playoffScoring(*playoff) 
     winners.append(playoff[winner_index]) 

    # At the end of each round, aggregate the winners in pairs 
    playoffTeamList = [winners[i:i+2] for i in xrange(0, len(winners), 2)] 
    print playoffTeamList 

這裏是一個工作的例子 -

import math 
from random import randint 

# Return randomly between 0 and 1(To be replaced by your algo) 
def playoffScoring(team1, team2): 
    return randint(0, 1) 


playoffTeamList = [ 
    ["T1", "T2"], ["T3", "T4"], 
    ["T5", "T14"], ["T13", "T12"], 
    ["T6", "T15"], ["T3", "T11"], 
    ["T7", "T8"], ["T9", "T10"] 
] 

num_rounds = int(math.log(len(playoffTeamList), 2)) + 1 
# num_rounds = 4 

for round in xrange(num_rounds): 
    winners = [] 
    for playoff in playoffTeamList: 
     winner_index = playoffScoring(*playoff) 
     winners.append(playoff[winner_index]) 
    playoffTeamList = [winners[i:i+2] for i in xrange(0, len(winners), 2)] 
    print playoffTeamList 

運行此 - (你運行這個每一次,它會產生不同的結果,因爲我已經在隨機函數​​)

# OUTPUTS - 
[['T2', 'T3'], ['T5', 'T13'], ['T6', 'T11'], ['T8', 'T9']] 
[['T3', 'T13'], ['T11', 'T8']] 
[['T13', 'T8']] 
[['T13']] 
+0

經測試,適用於我的目的。感謝一羣@Kamehameha。我選擇J0HN只是因爲那是我看到的第一個。我保存兩個腳本。隨着劇本的發展,我可能會改變主意。 – Mike