J'essaie de récupérer la sous-liste avec une valeur de clé maximale dans une liste.
par exemple. Dans cet exemple, j'essaie de récupérer la sous-liste avec un score de confiance maximal:
[{'id': '1', 'actions': [{'acc': 'acc1', 'coordinates': [569, 617, 627, 631], 'confidence': 95.0}]
Le résultat attendu est:
listA=[{'id': '1', 'actions': [{'acc': 'ac1', 'coordinates': [569, 617, 627, 631], 'confidence': 93.0}]}, {'id': '1', 'actions': [{'acc': 'acc1','coordinates': [569, 617, 627, 631], 'confidence': 94.0}]}, {'id': '1', 'actions': [{'acc': 'acc1', 'coordinates': [569, 617, 627, 631], 'confidence': 95.0}]}]
J'ai utilisé itemgetter mais il ne renvoie pas la sortie souhaitée.
3 Réponses :
J'ai utilisé la fonction max de python et lui ai fourni une clé qui utilisera la valeur-clé de confiance comme moyen de trouver le maximum.
listA=[{'id': '1', 'actions': [{'acc': 'ac1', 'coordinates': [569, 617, 627, 631], 'confidence': 93.0}]}, {'id': '1', 'actions': [{'acc': 'acc1','coordinates': [569, 617, 627, 631], 'confidence': 94.0}]}, {'id': '1', 'actions': [{'acc': 'acc1', 'coordinates': [569, 617, 627, 631], 'confidence': 95.0}]}] maxList = max(listA, key=lambda x: x['actions'][0]['confidence']) print(maxList)
Vous pouvez faire presque exactement la même chose si vous souhaitez renvoyer une liste triée des éléments plutôt que le maximum. Vous remplaceriez simplement max
par sorted
EDIT: Merci @tobias_k pour cette excellente suggestion. S'il y a plus d'une action, remplacez le lambda par lambda x: max(a['confidence'] for a in x['actions'])
Ah, 3 minutes plus tôt. Je vais supprimer ma réponse et voter pour la vôtre.
Eh bien: la première fois d'abord. Hourra!
Ou peut-être lambda x: max(a['confidence'] for a in x['actions'])
s'il peut y en avoir plusieurs.
@tobias_k Excellente suggestion! Je ne savais pas si le PO en aurait besoin ou non.
Voici une solution possible si vous trouvez que lambda est difficile à comprendre.
Je l'ai rendu très détaillé et convivial pour les débutants afin qu'il puisse également être utilisé par les nouveaux arrivants:
{'id': '1', 'actions': [{'confidence': 95.0, 'coordinates': [569, 617, 627, 631], 'acc': 'acc1'}]}
Production
listA=[{'id': '1', 'actions': [{'acc': 'ac1', 'coordinates': [569, 617, 627, 631], 'confidence': 93.0}]}, {'id': '1', 'actions': [{'acc': 'acc1','coordinates': [569, 617, 627, 631], 'confidence': 94.0}]}, {'id': '1', 'actions': [{'acc': 'acc1', 'coordinates': [569, 617, 627, 631], 'confidence': 95.0}]}] max_confidence_item = None max_confidence_value = float('-inf') # This is just a VERY small number so that we are sure that every confidence we find as first is bigger than this number for item in listA: current_confidence_value = item['actions'][0]['confidence'] current_confidence_item = item if (max_confidence_value < current_confidence_value): max_confidence_value = current_confidence_value max_confidence_item = current_confidence_item print(max_confidence_item)
confidence = 0 i = 0 for _ in range(len(listA)): if confidence < listA[_]['actions'][0]['confidence']: i += 1 confidence = listA[_]['actions'][0]['confidence'] print(listA[i -1])
Qu'avez-vous essayé jusqu'à présent?
itemgetter que j'ai déjà mentionné. Vérifiez s'il vous plaît.
Peut-il y avoir plusieurs
actions
et que doit-il faire alors?