给定一个元组列表,该列表由一个元组中的两个团队组成,返回一个从获胜团队到失败团队排序的列表

2024-06-16 12:39:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表:

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。在两支球队互不对抗的情况下,我们以这种方式确定获胜顺序:例如,如果我们想找出{}和{}之间的获胜顺序,因为{}赢了{}和{}赢了{},那么总体上{}也赢了{}

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

我有一个助手方法,可以找到两个特定团队之间的获胜顺序

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

但这种方法似乎无效。而且,只有当他们有一个共同的对手时,它才会起作用


Tags: inforlenifteammatchesappendlst
1条回答
网友
1楼 · 发布于 2024-06-16 12:39:40

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

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()

相关问题 更多 >