我有一个元组列表:
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个特定团队之间的获胜顺序
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
但是这种方法似乎无效。另外,只有在与他们有共同对手的对手对战的情况下,它才会起作用。
答案 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()