Словари форматирования Python в словаре

Я пытаюсь отформатировать этот словарь внутри словаря

Полный код:

for image in url_images:
    detected_faces = face_client.face.detect_with_url(url=image, return_face_attributes=face_attributes)
    if not detected_faces:
        await ctx.send('No faces detected in this image')

    for face in detected_faces:
        age = str(face.face_attributes.age)
        age_fin = age.split(".")
        
        gender = str(face.face_attributes.gender)
        gender_fin = gender.split(".")

        await ctx.send('Facial attributes detected:\nAge: '+ age_fin[0] + 
        '\nGender: ' + gender_fin[1] + 
        '\nEmotion: ' + str(face.face_attributes.emotion))

Вывод, который я получаю с кодом

Facial attributes detected:
Gender: male
Emotion: {'additional_properties': {}, 'anger': 0.001, 'contempt': 0.002, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.542, 'neutral': 0.455, 'sadness': 0.0, 'surprise': 0.0}

Пример форматирования желаемого:

Facial attributes detected:
Gender: male
Emotion: 0% anger, 0% contempt, 0% disgust, 0% fear, 0% happiness, 98% neutral, 0% sadness, 0% surprise

Что я пробовал:

Ошибка: TypeError: 'Emotion' object is not subscriptable. Вот скриншот моего кода с попыткой решения

emotions = ["anger", "contempt", "disgust", "fear", "happiness", "neutral", "sadness", "surprise"]
print('Emotion: ')
for emo in emotions:
    value = face.face_attributes.emotion[emo]
    print(f'{value} {emo},', end='')
print('\n')

API, который я использую https://azure.microsoft.com/en-us/services/cognitive-services/face/#demo

Можете ли вы добавить образец ответа, который вы получаете от API?

Harshana 11.12.2020 07:20

Можете ли вы уточнить, пожалуйста

Daniel Agafonov 11.12.2020 07:22

Я имел в виду значение, которое вы получаете из переменной face.face_attributes

Harshana 11.12.2020 07:22

В этом вопросе много лишней информации. Сводится ли это к тому, что у вас есть словарь: {'additional_properties': {}, 'anger': 0.001, 'contempt': 0.002, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.542, 'neutral': 0.455, 'sadness': 0.0, 'surprise': 0.0}, и вы хотите отформатировать его как Emotion: 0% anger, 0% contempt, 0% disgust, 0% fear, 0% happiness, 98% neutral, 0% sadness, 0% surprise?

Mark Tolonen 11.12.2020 07:23

да, это правда @MarkTolonen

Daniel Agafonov 11.12.2020 07:24
{'additional_properties': {}, 'age': 53.0, 'gender': <Gender.male: 'male'>, 'smile': 1.0, 'facial_hair': <azure.cognitiveservices.vision.face.models._models_py3.Faci‌​alHair object at 0x00000162A1BCDEB0>, 'glasses': <GlassesType.no_glasses: 'noGlasses'>, 'head_pose': None, 'emotion': <azure.cognitiveservices.vision.face.models._models_py3.Emot‌​ion object at 0x00000162A1BF9070>, 'hair': None, 'makeup': None, 'occlusion': None, 'accessories': None, 'blur': None, 'exposure': None, 'noise': None} Это результат, который я получаю, когда просто print(face.face_attributes)
Daniel Agafonov 11.12.2020 07:26

Разве это не то же самое, что и ваш предыдущий вопрос stackoverflow.com/questions/65244655/formatting-of-dictionar‌​ies

Barmar 11.12.2020 07:26

Ошибка указывает на то, что значение face.face_attributes.emotion на самом деле не является словарем, даже если оно печатается как словарь. Это экземпляр класса с именем Emotion.

Barmar 11.12.2020 07:28

Поскольку Emotion не является стандартным классом Python, вероятно, он определен библиотекой API. Вам нужно будет проверить его документацию, чтобы узнать, как получить динамический доступ к эмоциям.

Barmar 11.12.2020 07:29

Похоже, что функция ToRankedList(), упомянутая на этой странице справки, может вернуть словарь.

Mark Tolonen 11.12.2020 19:04

learn.microsoft.com/en-us/python/api/… Более подробную информацию я нашел здесь

Daniel Agafonov 11.12.2020 19:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
11
120
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Данный:

d = {'additional_properties': {}, 'anger': 0.001, 'contempt': 0.002, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.542, 'neutral': 0.455, 'sadness': 0.0, 'surprise': 0.0}

Это форматирует клавиши эмоций как желаемую строку:

print(', '.join([f'{v:.0%} {k}' for k,v in d.items() if k != 'additional_properties']))

Выход:

0% anger, 0% contempt, 0% disgust, 0% fear, 54% happiness, 46% neutral, 0% sadness, 0% surprise

Почему вы думаете, что у класса Emotion есть метод items(), как у словарей?

Barmar 11.12.2020 07:30

это не так, поэтому я получаю ошибку 'Emotion' object has no attribute 'items'

Daniel Agafonov 11.12.2020 07:32

@ Бармар, я не знаю. У меня нет библиотеки, но, учитывая d выше, она работает. Всегда можно сделать d = ast.literal_eval(str(face.face_attributes.emotion)) , так как он печатается как словарь :^)

Mark Tolonen 11.12.2020 07:32

не могли бы вы обновить свой ответ, пожалуйста? @МаркТолонен

Daniel Agafonov 12.12.2020 00:30
Ответ принят как подходящий
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
import os
import json

endpoint = ''
key = ''
face_client = FaceClient(endpoint, CognitiveServicesCredentials(key))
single_face_image_url = 'https://azurecomcdn.azureedge.net/cvt-4c22a847f7d6cb9f6d140f4927646992a7343e54da079181e641d3aae5d130bb/images/shared/cognitive-services-demos/face-detection/detection-1-thumbnail.jpg'
single_image_name = os.path.basename(single_face_image_url)
face_attributes = ['emotion']
detected_faces = face_client.face.detect_with_url(
    url=single_face_image_url,
    detectionModel='detection_02',
    return_face_attributes=face_attributes)
if not detected_faces:
    raise Exception('No face detected from image {}'.format(single_image_name))

for face in detected_faces:
    emotionObject = face.face_attributes.emotion.as_dict()
    print(', '.join([f'{v:.0%} {k}' for k, v in emotionObject.items(
    ) if k != 'additional_properties']))

Ответил Джим Сюй здесь

Другие вопросы по теме

Похожие вопросы

Я пишу код, чтобы принять пользовательский ввод и предоставить его документацию на python. Но строка в пользовательском вводе используется с кавычками в python
Идентификация точки и возвращение значения этой точки, сохраняя самое высокое значение в качестве эталона
Ошибка установки: pipenv install google-ads (TypeError: ожидаемая строка или байтовый объект)
Путаница с реверсивной функцией списка Python
Как создать таблицу частот и обновить ее по мере загрузки фрагментов данных в Python?
Pyspark — количество элементов, соответствующих различным комбинациям клавиш
Python: удаление чисел из нумерованного списка и удаление элементов с определенными символами
Рекуррентное отношение и временная сложность поиска следующего большего размера в общем дереве
Подпроцесс не может выполнять файлы с пандами
Почему пул и кешированный метод имеют почти одинаковое время выполнения?