#python #python-3.x #data-science
#python #python-3.x #наука о данных
Вопрос:
Я хотел бы выяснить процент от количества первых заказов и количества запросов, или сколько раз клиенты запрашивали этот продукт.
метрикой для этого является dict внутри dict
вот так:
{'product_name': 'Passion Fruit Flavored Fruit Juice Cocktail Blend', 'department_id': '7', 'metrics': {'request_count': 289, 'number_of_first_orders': 82}}
Мой код для этого прямо сейчас:
for entry in products:
percentage = round(float(products[entry]["metrics"]["number_of_first_orders"]) / total_for_department[products[entry]["department_id"]] , 2)
#print products[entry]["metrics"]["number_of_first_orders"] , total_for_department[products[entry]["department_id"]]
#print percentage
# go through all the products and output the metrics
print(products[entry]["department_id"], ",",products[entry]["metrics"]["request_count"], ",",products[entry]["metrics"]["number_of_first_orders"], ",", percentage)
Однако после запуска этого я получаю трассировку, которую я понимаю, но я не уверен, как получить доступ к dict внутри dict и синтаксису.
Traceback (most recent call last):
File "<ipython-input-13-2972dc07d77f>", line 3, in <module>
percentage = round(float(products[entry]["metrics"]["number_of_first_orders"]) / total_for_department[products[entry]["department_id"]] , 2)
TypeError: list indices must be integers or slices, not str
Любая помощь будет принята с благодарностью. Спасибо.
Комментарии:
1. Посмотрите на
values
методdicts
. Это поможет очистить ваш код.2. Что вы используете
total_for_department[int(products[entry]["department_id"])]
для приведенияstr
кint
?3. @Doba и как вы получаете
(.5)
, логически?4. Вы пытаетесь разделить
number_of_first_orders / department_id
? даже тогда это было бы82/7
=11.71
?5. @Dirtybit Прошу прощения, но да, ха-ха, не очень интуитивно понятно. Ошибка PEBCAK.
Ответ №1:
Ну, это поздно ночью и легко исправить, но благодаря @shawn и его умным комментариям людям, которые пытались, ответ поразил меня.
for entry in products:
percentage = (float(products[entry]["metrics"]["number_of_first_orders"]) / products[entry]["metrics"]["request_count"] , 2)
#print products[entry]["metrics"]["number_of_first_orders"] , total_for_department[products[entry]["department_id"]]
#print percentage
# go through all the products and output the metrics
print(products[entry]["department_id"], ",",products[entry]["metrics"]["number_of_first_orders"], ",",products[entry]["metrics"]["request_count"], ",", percentage)
Ответ №2:
Насколько я понимаю, у вас есть список словарей, подобных этому:
products = [
{'product_name': 'Passion Fruit Flavored Fruit Juice Cocktail Blend',
'department_id': '7',
'metrics': {'request_count': 289, 'number_of_first_orders': 82}},
{'product_name': 'Passion Fruit Flavored Fruit Juice Cocktail Blend',
'department_id': '7',
'metrics': {'request_count': 289, 'number_of_first_orders': 90}}
]
Когда вы выполняете итерацию products
с for entry in products
помощью, entry
в products
списке есть словарь. Таким образом, вы можете просто получить доступ к значению number_of_first_orders
следующим образом:
number_of_first_orders = entry["metrics"]["number_of_first_orders"]
Используя приведенный выше список, следующий код:
for entry in products:
number_of_first_orders = entry["metrics"]["number_of_first_orders"]
print(number_of_first_orders)
выводит:
82
90
Затем вы пытаетесь получить доступ к элементу total_for_department
списка, используя значение "department_id"
, но это значение является строкой, а не целым числом. Приведите его к int
первому, чтобы получить действительный индекс:
total_for_department[int(entry["department_id"])]
Таким образом, полная строка должна выглядеть так:
percentage = round(float(entry["metrics"]["number_of_first_orders"]) / total_for_department[int(entry["department_id"])] , 2)
Комментарии:
1. Вы не уловили проблему…. он обращался к списку, который он уже понял . давайте угадаем … где находится список? лол.
2. Кроме того, цель состоит в том, чтобы получить процент от чего-то, что все еще неясно.