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?
8 Réponses :
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]]
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))]
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]]
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
>>> 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}
cela devrait faire [* map (list, dict (sorted (foo)). items ())]
Ahh belle idée en utilisant trié ici
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.
Depuis que vous marquez pandas
pd.DataFrame(l).groupby(0).max().reset_index().values.tolist() Out[535]: [['a', 3], ['b', 7], ['c', 30]]
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]]
Vous voudrez peut-être stocker votre maximum temporaire dans un dictionnaire. De cette façon, vous pourrez toujours le résoudre avec J'espère que cela vous aidera! O (n) a> complexité. Jetez un œil à cet exemple rapide: mylist = [['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]]
myres = []
mymax = {}
for l in mylist:
# corresponds to 'a', 'b', 'c', ...
k = l[0]
# if your identifier is not already stored
# or the last value of your array is greater than the one that is already stored
if not k in mymax or l[-1] > mymax[k][-1]:
# apply a new maximum
# *after first iteration it holds -> {'a': ['a','abc',2]}
mymax[k] = l
# is used to convert back to a list, you may as well skip it if not needed
for _, v in mymax.items():
myres.append(v)
# prints [['a', 'ghi', 3], ['b', 'lmn', 7], ['c', 'yzz', 30]]
print(myres)