2
votes

obtenir la sous-liste maximale en fonction de la valeur d'une autre liste en python

souhaite obtenir une sous-liste qui a une valeur maximale sur l'index spécifié en fonction de la condition.

flist=[['RD-2', 'c', 127],['RD-3', 'b', 140],['RD-5', 'a', 120]]

et une autre liste

baselist=[['RD-2', 100],['RD-3', 200],['RD-5', 240]]

pour chaque première sous-élément dans la liste de base, j'ai besoin de la 1 sous-liste complète de la liste principale qui a une valeur maximale en 2ème position d'index. la sortie doit être

mainlist=[[['RD-2', 'a', 120], ['RD-2', 'b', 125], ['RD-2', 'c', 127]], [['RD-3', 'a', 120], ['RD-3', 'b', 140]], [['RD-5', 'a', 120]],[['RD-7', 'a', 122]]]

aidez-moi.


3 commentaires

Problème intéressant. Avez-vous essayé quelque chose?


@meowgoesthedog: essayé avec la boucle for de la liste de base mais n'a pas pu appliquer la logique à la liste principale pour obtenir la sous-liste max.


C'est génial que vous ayez déjà essayé quelque chose! Si vous pouvez nous montrer ce que vous avez essayé et l'erreur que vous avez eue, nous pouvons mieux vous comprendre et vous aider.


4 Réponses :


3
votes

Essayez ceci:

flist = [max(i, key=lambda x:x[2]) for i, item in product(mainlist,baselist) if i[0][0] == item[0]]

le flist sera:

from itertools import product    

flist = []               
for i, item in product(mainlist,baselist):      
     if i[0][0] ==item[0]:               
          flist.append(max(i, key=lambda x:x[2]))

vous pouvez également utiliser itertools.product pour simplementfy pour boucles un peu:

[['RD-2', 'c', 127], ['RD-3', 'b', 140], ['RD-5', 'a', 120]]

ou aussi en une seule ligne:

flist = []               
for item in baselist: 
     for i in mainlist:       
         if i[0][0] ==item[0]:               
             flist.append(max(i, key=lambda x:x[2]))


1 commentaires

votre bienvenue @learningstudent, veuillez considérer ceci: stackoverflow.com/help/someone-answers



2
votes

Un peu plus compact mais avec le même résultat en utilisant la compréhension de liste:

max_entries = [max(x, key=lambda x:x[2]) for x in mainlist]
flist = [max_entry for max_entry in max_entries for base_entry in baselist if max_entry[0]==base_entry[0]]


0 commentaires

2
votes

Voici une manière d'utiliser une compréhension de liste:

base = list(zip(*baselist))[0]
[max(i, key=lambda x:x[2]) for i in mainlist if i[0][0] in base]
[['RD-2', 'c', 127], ['RD-3', 'b', 140], ['RD-5', 'a', 120]]


0 commentaires

1
votes

Je commencerais par stocker vos listes maximales dans un dictionnaire, puis je ferais simplement référence à ce dictionnaire plus tard pour créer la nouvelle liste:

from operator import itemgetter

mainlist = [
    [["RD-2", "a", 120], ["RD-2", "b", 125], ["RD-2", "c", 127]],
    [["RD-3", "a", 120], ["RD-3", "b", 140]],
    [["RD-5", "a", 120]],
    [["RD-7", "a", 122]],
]

baselist = [["RD-2", 100], ["RD-3", 200], ["RD-5", 240]]

d = {}
for sublist in mainlist:
    k = sublist[0][0]
    d[k] = max(sublist, key=itemgetter(2))

flist = [d.get(k) for k, _ in baselist]

print(flist)
# [['RD-2', 'c', 127], ['RD-3', 'b', 140], ['RD-5', 'a', 120]]


0 commentaires