Учитывая список кортежей, состоящих из 2 команд в кортеже, вернуть список, отсортированный от команды-победителя к команде-проигравшему - PullRequest
1 голос
/ 29 февраля 2020

У меня есть список кортежей:

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 команды не играют друг против друга, мы определяем порядок выигрыша следующим образом: например, если мы хотим выяснить порядок выигрыша между T и A, поскольку D выигрывает A и T выигрывает у D, в целом T выигрывает у A, а также T > D > A.

Определить функцию winning_list(matches), которая возвращает отсортированный список команд, например, ["Team T", "Team D", "Team A", ...]

У меня есть вспомогательный метод для определения порядка выигрыша между 2 указанными c командами

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 Ответ

1 голос
/ 29 февраля 2020

С предоставленной информацией о том, как ранжировать решение, можно:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...