给定一个元组列表,该元组列表包含一个元组中的2个团队,请返回一个从获胜团队到失败团队的排序列表

时间:2020-02-29 11:19:28

标签: python list tuples

我有一个元组列表:

matches = [("Team D","Team A"), ("Team E","Team B"), ("Team T","Team B"), ("Team T","Team D"), ("Team F","Team C"), ("Team C","Team L"), ("Team T","Team F")]

以第一个元组为例,例如("Team D", "Team A"),因为D在元组中的A之前,因此D胜过A。在2个团队不互相对抗的情况下,我们以这种方式确定获胜顺序:例如,如果我们想找出TA之间的获胜顺序,因为D胜过AT胜过D,总体T也胜过AT > D > A

定义一个函数winning_list(matches),该函数返回一组排序的团队列表,例如["Team T", "Team D", "Team A", ...]

我有一个辅助方法来查找2个特定团队之间的获胜顺序

def winner(matches, team_1, team_2):
    size = len(matches)
    lst1 = []
    lst2 = []
    for i in range(0, size): # extract games with team1
        if matches[i][0] == team1 or matches[i][1] == team1:
            lst1.append(matches[i])
        elif matches[i][0] == team2 or matches[i][1] == team2: # extract games with team2
            lst2.append(matches[i])
    lst_partner1 = [] # opponent teams involving team1
    lst_partner2 = [] # opponent teams involving team2
    for i in range(0, len(lst1)):
        if lst1[i][0] != team1:
            lst_partner1.append(lst1[i][0])
        elif lst1[i][1] != team1:
            lst_partner1.append(lst1[i][1])
    for i in range(0, len(lst2)):
        if lst2[i][0] != team2:
            lst_partner2.append(lst2[i][0])
        elif lst2[i][1] != team2:
            lst_partner2.append(lst2[i][1])
    common = [value for value in lst_partner1 if value in lst_partner2] # opponent team that played against team1 and team2
    # print(common)
    opponent_team = common[0]
    # print(opponent_team)
    if len(common) == 0:
        return 0
    else:
        for  i in range(0, len(lst1)):
            if opponent_team in lst1[i]:
                idx_opp1 = lst1[i].index(opponent_team)
        for l in range(0, len(lst2)):
            if opponent_team in lst2[l]:
                idx_opp2 = lst2[l].index(opponent_team)

        if idx_opp1 == idx_opp2:
            return 0
        elif idx_opp1 < idx_opp2:
            return 2
        elif idx_opp1 > idx_opp2:
            return 1
        else:
            return 0

但是这种方法似乎无效。另外,只有在与他们有共同对手的对手对战的情况下,它才会起作用。

1 个答案:

答案 0 :(得分:1)

提供的有关如何对解决方案进行排名的信息可能是:

from collections import defaultdict

matches = [("Team D", "Team A"), ("Team E", "Team B"), ("Team T", "Team B"),
           ("Team T", "Team D"), ("Team F", "Team C"), ("Team C", "Team L"),
           ("Team T", "Team F")]


def winning_list(mathces):
    scores = defaultdict(int)
    for fst, snd in matches:
        scores[fst] += 1
        scores[snd] -= 1
    return sorted(scores.items(), key=lambda e: e[1], reverse=True)


ranking = winning_list(matches)
print(ranking)

为了使其更简单,我们可以使用collections.Counter

from collections import Counter


def winning_list2(mathces):
    scores = Counter()
    for fst, snd in matches:
        scores[fst] += 1
        scores[snd] -= 1
    return scores.most_common()