0
votes

Obtenir la sous-liste avec une valeur maximale à partir d'une liste

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 commentaires

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?


3 Réponses :


2
votes

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'])


4 commentaires

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.



0
votes

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)


0 commentaires

0
votes
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]) 

0 commentaires