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.