@Taron4uk

Как исправить ошибку в присвоении переменной?

Подскажите, пожалуйста, где может быть ошибка в коде?
Пишет "Traceback (most recent call last):
File "C:\Users\Максим\PycharmProjects\pythonProject\probe\ДЗ 3\05_store.py", line 53, in
price_1 = code['price']
TypeError: string indices must be integers"
# -*- coding: utf-8 -*-

# Есть словарь кодов товаров

goods = {
    'Лампа': '12345',
    'Стол': '23456',
    'Диван': '34567',
    'Стул': '45678',
}

# Есть словарь списков количества товаров на складе.

store = {
    '12345': [
        {'quantity': 27, 'price': 42},
    ],
    '23456': [
        {'quantity': 22, 'price': 510},
        {'quantity': 32, 'price': 520},
    ],
    '34567': [
        {'quantity': 2, 'price': 1200},
        {'quantity': 1, 'price': 1150},
    ],
    '45678': [
        {'quantity': 50, 'price': 100},
        {'quantity': 12, 'price': 95},
        {'quantity': 43, 'price': 97},
    ],
}

# Рассчитать на какую сумму лежит каждого товара на складе.
#
# Вывести суммарную стоимость каждого товара на складе c помощью циклов
# То есть: всего по лампам, стульям, етс.
# Формат строки вывода: "<товар> - <кол-во> шт, стоимость <общая стоимость> руб"
#
# Алгоритм должен получиться приблизительно такой:
#
# цикл for по товарам с получением кода и названия товара
#     инициализация переменных для подсчета количества и стоимости товара
#     получение списка на складе по коду товара
#     цикл for по списку на складе
#         подсчет количества товара
#         подсчет стоимости товара
#     вывод на консоль количества и стоимости товара на складе
summ = dict()
for name in goods:
    code = goods[name]
    print('Название товара:', name, '    Его код:', code)
    for code in store:
        price_1 = code['price']
        quantity_1 = code['quantity']
        summ = price_1 * quantity_1
        print('полная стоимость товара:', summ)
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Vindicar
@Vindicar
for code in store:
Для словаря цикл for перебирает ключи, т.е. '12345', '23456'...
А ты как будто что-то другое перебираешь, типа
for item in store[code]:
    print(item['price'], 'x', item['quantity'])
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
в строке
for code in store:
вы перебираете ключи словаря.
затем, получив очередной ключ в переменную code, вы в строке
price_1 = code['price']
обращаетесь к тому, что находится в code, и пытаетесь найти элемент его по индексу "price".
Но в code находится ключ, и он - строка. Об этом вам и говорит ошибка - так со строкой работать нельзя.

Для того, чтобы правильно всё сделать, можно попробовать так:
for name in goods:
    code = goods[name]
    print('Название товара:', name, '    Его код:', code)
    for code in store:
        price_1 = store[code][0]['price']
        quantity_1 = store[code][0]['quantity']
        summ = price_1 * quantity_1
        print('полная стоимость товара:', summ)

или так:
for name in goods:
    code = goods[name]
    print('Название товара:', name, '    Его код:', code)
    for code, value in store.items():
        price_1 = value[0]['price']
        quantity_1 = value[0]['quantity']
        summ = price_1 * quantity_1
        print('полная стоимость товара:', summ)
Ответ написан
Комментировать
@dmshar
Господи, ну когда же народ научиться сперва включать мозги и самостоятельно искать ответы на такие простейшие вопросы, а уж потом писать вопросы на форум!
Ну написано же, ясно, четко, ОДНОЗНАЧНО:
price_1 = code['price']
TypeError: string indices must be integers"

Ну что же тут не ясно!!! В любом IDE в менеджере переменных сразу же видно, что
в объекте code в момент выполнения строки
price_1 = code['price']
находится строковое значение '12345'. СТРОКОВОЕ!!!! А в строке индексом может быть исключительно int-значение. А вы пытаетесь вместо индекса указать опять-таки строку
'price'

Только не спрашиваете, как это исправить. Потому что понять логику вашей программы, в которой вы сначала в создаете объект
code
, копируя в него элемент словаря
goods[name]
, а потом этот же объект внутри цикла используете как объект - итератор цикла -
for code in store:
, т.е. перебирая объекты уже совершенно другого словаря
store
лично я не в силах. Чего вы хотели-то от такой дивной конструкции?

Совет: сначала исправьте логику программы, а потом - может и синтаксис исправлять не придется.
И еще совет. Откройте учебник по Python, найдите в нем главу про словари, потом посмотрите, как делать обход словаря. Это азы! И разберитесь, в чем разница между следующими тремя конструкциями:
for val in dict.values()
for key in dict.keys():
for key in dict:
Ответ написан
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Просто если вдруг препод поспросит другой вариант

def extractor(store):
    for product in store:
        price = 0
        quantity = 0
        for info in store[product]:
            quantity += info["quantity"]
            price += info["price"]
            yield product, quantity, price


stock = {product: {"code": product, "quantity": quantity, "price": price}
         for product, quantity, price in extractor(store)}

for product in goods:
    print("Название - {}, Код - {code}, Кол-во - {quantity}, Стоимость - {price}"
          .format(product, **stock[goods[product]]))


вывод

Название - Лампа, Код - 12345, Кол-во - 27, Стоимость - 42
Название - Стол, Код - 23456, Кол-во - 54, Стоимость - 1030
Название - Диван, Код - 34567, Кол-во - 3, Стоимость - 2350
Название - Стул, Код - 45678, Кол-во - 105, Стоимость - 292
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы