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.
4 Réponses :
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]))
votre bienvenue @learningstudent, veuillez considérer ceci: stackoverflow.com/help/someone-answers
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]]
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]]
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]]
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.