Как получить доступ к объекту словаря внутри словаря (с помощью цикла for)? Python 3.6

#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. Кроме того, цель состоит в том, чтобы получить процент от чего-то, что все еще неясно.