Как найти наибольшее значение элемента во вложенном dict в python? - PullRequest
2 голосов
/ 10 марта 2020

У меня есть следующий диктат с вложенным диктом «Эмоции»:

Я пытаюсь найти простой способ вернуть 2 верхних эмоции «Тип» с самыми большими 2 значениями «Доверие» (в случае из этого диктата, это «ЗАТЕМНЕНО» и «ЗЛО»

[
    {
        "AgeRange": {
            "High": 52,
            "Low": 36
        },
        "Emotions": [
            {
                "Confidence": 22.537073135375977,
                "Type": "ANGRY"
            },
            {
                "Confidence": 1.3983955383300781,
                "Type": "SAD"
            },
            {
                "Confidence": 1.2260702848434448,
                "Type": "DISGUSTED"
            },
            {
                "Confidence": 2.291703939437866,
                "Type": "FEAR"
            },
            {
                "Confidence": 8.114240646362305,
                "Type": "HAPPY"
            },
            {
                "Confidence": 10.546235084533691,
                "Type": "SURPRISED"
            },
            {
                "Confidence": 18.409439086914062,
                "Type": "CALM"
            },
            {
                "Confidence": 35.47684097290039,
                "Type": "CONFUSED"
            }
        ],
    }
]

Я пробовал что-то вроде dictmax = max(dict[Emotions][Confidence] key=dict.get), но это, похоже, не работает, и я в растерянности. Я чувствую, что должно быть простой способ получить только тип, основанный на значении доверия.

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вы можете попробовать это.

for d in my_list:
    out=sorted(d['Emotions'],key=lambda x:x['Confidence'],reverse=True)[:2]

[{'Confidence': 35.47684097290039, 'Type': 'CONFUSED'},
 {'Confidence': 22.537073135375977, 'Type': 'ANGRY'}]

Вы также можете использовать nlargest.

from heapq import nlargest
for d in a:
    out=nlargest(2,d['Emotions'],key=lambda x:x['Confidence'])
1 голос
/ 10 марта 2020

Ответ Ch3steR работает, но я хотел бы предложить решение с pandas, которое является библиотекой для анализа данных (с использованием объектов DataFrame, которые позволяют легко манипулировать данными).

В вашем примере, давайте просто возьмем соответствующую часть примера:

emotions = [{'Confidence': 22.537073135375977, 'Type': 'ANGRY'},
 {'Confidence': 1.3983955383300781, 'Type': 'SAD'},
 {'Confidence': 1.2260702848434448, 'Type': 'DISGUSTED'},
 {'Confidence': 2.291703939437866, 'Type': 'FEAR'},
 {'Confidence': 8.114240646362305, 'Type': 'HAPPY'},
 {'Confidence': 10.546235084533691, 'Type': 'SURPRISED'},
 {'Confidence': 18.409439086914062, 'Type': 'CALM'},
 {'Confidence': 35.47684097290039, 'Type': 'CONFUSED'}]

Это можно привести к объекту pandas DataFrame:

import pandas as pd
pd.DataFrame(emotions)

выход

    Confidence  Type
0   22.537073   ANGRY
1   1.398396    SAD
2   1.226070    DISGUSTED
3   2.291704    FEAR
4   8.114241    HAPPY
5   10.546235   SURPRISED
6   18.409439   CALM
7   35.476841   CONFUSED

Этот объект может быть отсортирован по любому столбцу (например, по доверию), с помощью метода .sort_values последние две (или любое другое число) строк можно выбрать с помощью метода .tail(2), и, наконец, можно выбрать столбец «Тип». Подведем итоги:

pd.DataFrame(emotions).sort_values('Confidence').tail(2)['Type'].values

дает

array(['ANGRY', 'CONFUSED'], dtype=object)

Если вы хотите верхнюю 1, а не верхнюю n (для n> 1), поиск и поиск быстрее и проще максимум вместо сортировки:

emotions.loc[emotions['Confidence'].idxmax(),'Type']

приводит к

'CONFUSED'

Это не быстрее, чем ответ Ch3steR, но код более прост (если вы знаете библиотеку pandas) и легко «масштабировать» до более сложного анализа данных, который вам может понадобиться позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...