2
votes

Comment obtenir la liste ([a, 2], [a, 1], [a, 3]) avec le nombre le plus élevé ([a, 3])

J'ai un

for letter in range(len(final)):
    array1=[]
    array2=[]
    highestvalue=0
    if final[letter][0] == final[letter+1][0]:
        if final[letter][2] < final[letter+1][2]:
            highestvalue=final[letter+1][2]
            array1.append(final[letter][0])
            array1.append(highestvalue)
            array2.append(array1)

Comment obtenir la liste du chiffre le plus élevé pour chaque lettre? Et cette liste l'ajoute à une autre liste contenant le numéro le plus élevé pour chaque lettre?

J'ai essayé d'utiliser le code suivant, mais je suis nouveau dans la programmation en python et je ne sais pas grand-chose sur les structures de données ou la programmation.

list=[[a,2],[a,1],[a,3],[b,5],[b,7],[b,6],[c,20],[c,23],[c,30]].

Existe-t-il un moyen de sortir [[a, 3], [b, 7], [c, 30]] de la liste?

[MODIFIER] En fait, ma liste est [[a, abc, 2], [a, def, 1], [a, ghi, 3], [b, jkl, 5], [b, lmn, 7], [b, opq , 6], [c, rst, 20], [c, vwx, 23], [c, yzz, 30]].

Ce que j'attends, c'est de créer une liste qui stocke les variables [[a , ghi, 3], [b, lmn, 7], [c, yzz, 30]]. Comment puis-je créer la liste avec le deuxième élément, avec la lettre et la valeur maximale?


0 commentaires

8 Réponses :


2
votes

Vous pouvez utiliser itertools.groupby pour regrouper les sous-listes par lettres et rechercher le maximum dans chaque groupe:

from operator import itemgetter as g
from itertools import groupby

[max(v, key=g(1)) for k, v in groupby(l, g(0))]
# [['a', 3], ['b', 7], ['c', 30]]


1 commentaires

Vous utilisez déjà itemgetter , allez à la ville depuis l'opérateur import itemgetter comme g; à partir d'itertools import groupby; [max (v, key = g (1)) pour k, v dans groupby (l, g (0))]



0
votes

Vous pouvez le résoudre avec de simples générateurs Python:

lst=[['a',2],['a',1],['a',3],['b',5],['b',7],['b',6],['c',20],['c',23],['c',30]]
[max(filter(lambda x: x[0] == elem, lst), key=lambda x: x[1]) for elem in set([e[0] for e in lst])]

vous renverra:

[['c', 30], ['b' , 7], ['a', 3]]


0 commentaires

0
votes

Vous devriez envisager d'utiliser un emplacement pour stocker (un dictionnaire) la valeur la plus élevée rencontrée pour chaque lettre.

Parcourez ensuite la liste et comparez la valeur que vous avez en stockage avec la nouvelle valeur de la lettre.

list=[[a,2],[a,1],[a,3],[b,5],[b,7],[b,6],[c,20],[c,23],[c,30]]
storing_maximum={}
for x,y in list:
    if x in storing_maximum:
        storing_maximum[x] = max(storing_maximum[x],y)
    else:
        storing_maximum[x] = y


0 commentaires

1
votes
>>> foo = [['a', 2],['a', 1],['a', 3],
           ['b', 5],['b', 7],['b', 6],
           ['c', 20],['c', 23],['c', 30]]
>>> print({key:value for key, value in sorted(foo)})
{'a': 3, 'b': 7, 'c': 30}

2 commentaires

cela devrait faire [* map (list, dict (sorted (foo)). items ())]


Ahh belle idée en utilisant trié ici



0
votes

Tout d'abord, séparez votre liste en listes séparées, une pour chaque lettre. Ensuite, construisez une liste des seconds éléments et prenez le max de celui-ci.

Une autre possibilité est de construire un dict saisi par la lettre; la valeur de chaque élément est la valeur maximale que vous avez vue pour cette lettre.

Pouvez-vous y prendre forme? Sinon, je recommande de travailler sur la logique avec quelqu'un de local, car Stack Overflow n'est pas un site de didacticiel.


0 commentaires

2
votes

Depuis que vous marquez pandas

pd.DataFrame(l).groupby(0).max().reset_index().values.tolist()
Out[535]: [['a', 3], ['b', 7], ['c', 30]]


0 commentaires

0
votes

Solution Pandas:

pd.DataFrame(l).sort_values([0, 2]).drop_duplicates(subset=[0], keep='last').values.tolist()

Out[23]: [['a', 'ghi', 3], ['b', 'lmn', 7], ['c', 'yzz', 30]]


0 commentaires