Имеется список словарей, которые содержат информацию о магазинах:
shops = [
{"name": "Barneys New York", "state": "NY"},
{"name": "Bealls", "state": "CO"},
{"name": "Belk.", "state": "PA"},
{"name": "Boscov's.", "state": "AL"},
{"name": "Dillard's.", "state": "OH"},
{"name": "Hudson's Bay Company", "state": "NY"},
{"name": "Lord & Taylor", "state": "CA"},
{"name": "Saks Fifth Avenue", "state": "NY"},
{"name": "J. C. Penney.", "state": "MD"},
{"name": "Kohl's.", "state": "VA"},
]
Если вы хотите перебирать список, вам не нужен счетчик итераторов.Вызов переменной, которую вы хотите перебрать, даст вам каждый элемент по одному.
for shop in shops:
Следующие строки позволят выполнить то же самое, но это намного сложнее для чтения и вводит много ненужных операций.Магазины уже прошли бы итерацию для генерации len()
, затем вы создаете еще один итератор range()
.Наконец, вы индексируете что-то, что можно было легко передать вам.Так что да, используйте более простой способ зацикливания.
for i in range(len(shops)):
shop = shops[i]
Теперь, если вы хотите узнать, находится ли этот магазин в заданном состоянии, вы можете проверить, находится ли он в одном из ключей словаря, используяif <state> in shop.values()
или, если вы знаете, что ищете пару ключ / значение состояния, вы можете напрямую оценить ключ словаря с помощью shop['state']
.Если это соответствует желаемому состоянию, просто распечатайте то, что вам нужно.
for shop in shops:
if shop['state'] == 'CA':
print(shop['name'])
# Lord & Taylor
На этом этапе вы можете получить доступ к любой части словаря магазина и выполнить любую действительную логику.
С вашим кодом вам лучше сразу поместить все в список.Если вы получаете информацию определенным образом, то вам придется иметь дело с ней, но если вы жестко запрограммировали ее в свой файл, как этот, тогда продолжайте и включите это:
dict_A = {'name':'A', 'goods':'clothing', 'price':200}
dict_B = {'name':'B', 'goods':'interior', 'price':180}
dict_C = {'name':'C', 'goods':'clothing', 'price':50}
shops_all = [dict_A, dict_B, dict_C]
в это
shops_all = [
{'name':'A', 'goods':'clothing', 'price':200},
{'name':'B', 'goods':'interior', 'price':180},
{'name':'C', 'goods':'clothing', 'price':50},
]
Теперь, допустим, вы хотите найти одежду, и у вас есть только 100 долларов.
choice = 'clothing'
price = 100
Теперь я предполагаю, что вы предполагали, что бюджет будет максимальным, который вы хотелипотратить, поэтому у вас есть логическая ошибка в вашей строке if price <= item['price']
.Здесь вы смотрите, где цена магазина выше, чем вы хотите.Итак, давайте перевернем это на item['price'] <= price
.У вас также была небольшая ошибка, когда вы указали item['shop']
, когда вы имели в виду item['name']
на основе ваших данных выборки.Как только они будут исправлены, вы можете дать ему шанс.
for item in shops_all:
if choice == item['goods']:
if item['price'] <= price:
print('shop {}, price {} dollars'.format(item['name'], item['price']))
else:
print('no such shop')
# no such shop
# shop C, price 50 dollars
Теперь вы видите сообщение «Нет такого магазина», что явно не так.Здесь есть две проблемы с кодом.1) else должен быть смещен до первого оператора if и 2) он все равно будет pritnt для магазина B. Итак, здесь может пригодиться переменная флага success
.Вы можете установить переменную в false и перевернуть ее в true, если у вас есть совпадение.Затем проверьте после завершения итерации, хотите ли вы напечатать сообщение, сообщающее им, что им не повезло.Кроме того, было бы хорошо проверить выбор и цену одновременно, используя and
.
success = False
for item in shops_all:
if choice == item['goods'] and item['price'] <= price:
success = True
print('shop {}, price {} dollars'.format(item['name'], item['price']))
if not success:
print('no such shop')
# shop C, price 50 dollars