D'accord, cela peut être similaire à ce fil de discussion: Trouver les 4 valeurs les plus élevées d'un tableau

Mais je ne sais pas comment faire avec les listes 2D donc c'est mon problème: j'ai une liste:

teams = [Randomteam1,Randomteam2,Randomteam3,Randomteam4,Randomteam5,Randomteam6]

Et une liste 2D:

team_info = [[7, 2, 1, 1, 3], [4, 1, 1, 1, 3],[2, 0, 2, 2, 3], [12, 3, 0, 0, 3]],
             [9, 0, 2, 2, 3], [10, 3, 0, 0, 6]]

Dans cette liste, chacun par exemple, [7, 2, 1, 1, 3] est une information des scores d'une équipe, 7 est le nombre de points, 2 le nombre de victoires, 1 perd, 1 nuls, 3 pour les parties jouées. Et chaque bloc dans team_info est connecté à l'une des équipes en équipes. Par exemple:

Randomteam1 = [7, 2, 1, 1, 3], Randomteam2 = [4, 1, 1, 1, 3]

Etc..

Maintenant, je veux obtenir / afficher les 4 meilleures équipes avec le plus de POINTS et les 2 dernières équipes avec les points les plus bas.

2
draggem 23 juil. 2015 à 13:23

2 réponses

Meilleure réponse

J'aurais probablement utilisé un dict mais vous pouvez compresser les listes ensemble pour faire des paires puis trier:

teams = ["Randomteam1","Randomteam2","Randomteam3","Randomteam4","Randomteam5","Randomteam6"]


team_info = [[7, 2, 1, 1, 3], [4, 1, 1, 1, 3],[2, 0, 2, 2, 3], [12, 3, 0, 0, 3], [9, 0, 2, 2, 3], [10, 3, 0, 0, 6]]


data = sorted(zip(teams,team_info),key= lambda x: x[1][0],reverse=True)

[('Randomteam4', [12, 3, 0, 0, 3]), ('Randomteam6', [10, 3, 0, 0, 6]), ('Randomteam5', [9, 0, 2, 2, 3]), ('Randomteam1', [7, 2, 1, 1, 3]), ('Randomteam2', [4, 1, 1, 1, 3]), ('Randomteam3', [2, 0, 2, 2, 3])]

Le résultat est que les équipes sont triées par ordre de score le plus élevé au plus bas, la clé de tri est x[1][0] qui est le premier élément du deuxième élément de chaque appariement qui correspond au total des points de chaque équipe.

Les 4 premiers seront data[:4], les deux dernières équipes seront data[-2:]

Si vous utilisez un dict, il sera facile d'associer les équipes et d'accéder à leurs données, vous pouvez stocker l'équipe et les données sous forme de dict et utiliser un rang comme clé:

data = {}
srt = sorted(zip(team_info, teams), reverse=True,1)
for ind, (b,a) in enumerate(srt):
    p, w, l, d, gp = b
    data["rank_{}".format(ind)] = {"team":a,"points": p, "wins": w, "loss": l, "draw": d, "games": gp}



from pprint import pprint as pp

pp(data)

Production:

{'rank_1': {'team': 'Randomteam4',
            'draw': 0,
            'games': 3,
            'loss': 0,
            'points': 12,
            'wins': 3},
 'rank_2': {'team': 'Randomteam6',
            'draw': 0,
            'games': 6,
            'loss': 0,
            'points': 10,
            'wins': 3},
 'rank_3': {'team': 'Randomteam5',
            'draw': 2,
            'games': 3,
            'loss': 2,
            'points': 9,
            'wins': 0},
 'rank_4': {'team': 'Randomteam1',
            'draw': 1,
            'games': 3,
            'loss': 1,
            'points': 7,
            'wins': 2},
 'rank_5': {'team': 'Randomteam2',
            'draw': 1,
            'games': 3,
            'loss': 1,
            'points': 4,
            'wins': 1},
 'rank_6': {'team': 'Randomteam3',
            'draw': 2,
            'games': 3,
            'loss': 2,
            'points': 2,
            'wins': 0}}
2
Padraic Cunningham 23 juil. 2015 à 11:33

Vous pouvez trier votre liste et obtenir les éléments avec une simple tranche:

>>> sorted(team_info,key=itemgetter(0),reverse=True)[:4]
[[12, 3, 0, 0, 3], [10, 3, 0, 0, 6], [9, 0, 2, 2, 3], [7, 2, 1, 1, 3]]

>>> sorted(team_info,key=itemgetter(0),reverse=True)[-2:]
[[4, 1, 1, 1, 3], [2, 0, 2, 2, 3]]

Et si vous voulez également le nom des équipes, vous pouvez utiliser zip:

>>> sorted(zip(teams,team_info),key=itemgetter(1,0),reverse=True)[:4]
[('Randomteam4', [12, 3, 0, 0, 3]), ('Randomteam6', [10, 3, 0, 0, 6]), ('Randomteam5', [9, 0, 2, 2, 3]), ('Randomteam1', [7, 2, 1, 1, 3])]
>>> 
>>> zip(*sorted(zip(teams,team_info),key=itemgetter(1,0),reverse=True)[:4])[0]
('Randomteam4', 'Randomteam6', 'Randomteam5', 'Randomteam1')

Vous pouvez également utiliser heapq.nlargest et nsmallest pour obtenir les N éléments les plus grands et les plus petits:

>>> import heapq
>>> heapq.nlargest(4,team_info,key=itemgetter(0))
[[12, 3, 0, 0, 3], [10, 3, 0, 0, 6], [9, 0, 2, 2, 3], [7, 2, 1, 1, 3]]

>>> heapq.nsmallest(2,team_info,key=itemgetter(0))
[[2, 0, 2, 2, 3], [4, 1, 1, 1, 3]]
1
Kasramvd 23 juil. 2015 à 10:33