#python
#python
Вопрос:
Если элемент list_goods[i] не существует в переменной all_keys, которая является ключом dictionary, я должен перехватить исключение и добавить элемент, за которым следует значение «none», в новую переменную dictionary. Однако мои коды не работают. Буду признателен, если кто-нибудь укажет мне правильное направление, спасибо! P.s Я не должен использовать If else в этом задании.
Список и словарь в основном методе
dict_q2 = {"vinegar": [120.0, 100], "ketchup": [950, 1000],"apples": [850,1100],"oranges": [1050, 0]
}
list_q2 = ["ketchup","oranges","pear"]
Функция для получения приведенного выше списка и определения
def compute_unit_prices(dict_goods, list_goods):
#dict variable with name of good as key and unit prices as values.
return_dict = {}
all_keys = dict_goods.keys()
i =0
#Try block
try:
while (list_goods[i] in all_keys):
goods_name = list_goods[i]
storage = dict_goods[goods_name]
results = storage[0] / storage[1]
return_dict.update({goods_name:results})
i = i 1
except KeyError as e:
return_dict.update({goods_name:"none"})
# If zeroDivisionError is encountered, this block of code is used
except ZeroDivisionError as e:
results = -1
return_dict.update({goods_name:results})
# This block of code works if errors other than the above two occurs
except:
return_dict = {}
finally:
print(return_dict)
Комментарии:
1. Почему вы «должны создавать исключение»? Почему вы не можете просто принять меры по исправлению положения, если
list_goods[i]
это не такall_keys
?2. Здесь много проблем. Прежде всего,
goods_name
переменная может быть неопределенной, если здесь генерируется исключение:while (list_goods[i] in all_keys):
. Кроме того, если генерируется исключение, вы не меняете значениеi
, поэтому вы будете продолжать переходить к одному и тому же значению снова и снова. Наконец,except KeyError as e
— здесь переменнаяe
ни для чего не используется, зачем она вообще?3. кстати, это может помочь, если вы скажете, в чем проблема. Удивительно, что ваш код, даже если он неверен, работал на моем компьютере.
{'ketchup': 0.95, 'oranges': -1}
4. Проблема заключается в том, что полученный результат u является частью ответа. однако предполагается, что у меня есть дополнительная «груша»: нет. таким образом, для pear, которого нет в dict_q2, его значение будет автоматически установлено на none . Я пытался использовать исключение ключевой ошибки, но безрезультатно, поскольку я не должен использовать операторы If-else.
5. Я понимаю. Проверьте мой ответ.
Ответ №1:
- Вам сказали убедиться, что ваш код генерирует исключения (ошибка времени выполнения) и перехватывает их
try
. И все же ваш код избегает перебора отсутствующих ключей словаря из-за особогоwhile
условия цикла. Что неверно на многих уровнях. Лучше реорганизоватьfor i in range(len(list_goods))
цикл. В противномwhile
случае завершается цикл по первому ключу из словаря, поэтомуKeyError
исключение не имеет ни единого шанса возникнуть. Также выi
рискуете выйти за рамки. - Переместите обработку исключений внутрь цикла. В противном случае первое исключение завершит цикл, и вы захотите обработать каждый элемент списка.
- Удалить
finally
. Вам это больше не нужно. Просто выведите результат за пределы цикла.
PS. На самом деле for good in list_goods
он более питонический, используйте его, если вам достаточно комфортно с циклом python, но вам нужно будет внести дополнительные изменения внутри цикла.
Комментарии:
1. Почему бы не использовать
finally
?Else
выполняется только в том случае, еслиtry
блок выполнен успешно, но вы в любом случае захотите распечатать результирующий словарь, следовательноfinally
, это уместно.