#python #function #for-loop #jupyter-notebook
#python #функция #for-цикл #jupyter-ноутбук
Вопрос:
Я пытаюсь вычислить алкоголь по объему (abv) некоторого пива, используя переменные из 2 отдельных списков (которые я взял из словарной статьи). У меня возникли проблемы с получением значений из обоих списков для применения к уравнению, которое у меня есть для abv (и, вероятно, невозможно создать цикл for с оператором and, подобным тому, который у меня есть ниже). Возможно ли получить переменные из двух отдельных списков, которые будут включены в одно и то же уравнение в одном цикле for?
Прямо сейчас это говорит мне, что у меня ошибка типа, когда объект ‘bool’ не может быть итерирован. Вот что я пробовал до сих пор с точки зрения кодирования:
beers = {"SG": [1.050, 1.031, 1.077, 1.032, 1.042, 1.055, 1.019, 1.089, 1.100, 1.032],
"FG": [1.010, 1.001, 1.044, 1.003, 1.003, 1.013, 1.002, 1.020, 1.056, 1.000],
"grad student 1": [5.264, 3.983, 4.101, 7.216, 2.313, 4.876, 2.255, 8.991, 5.537, 4.251],
"grad student 2": [5.211, 3.008, 4.117, 3.843, 5.168, 5.511, 3.110, 8.903, 5.538, 4.255]}
#separating the SG and FG values from the dictionary entry
SG_val = beers["SG"]
FG_val = beers['FG']
def find_abv(SG = SG_val, FG = FG_val):
abv_list = []
i = 0.0
j = 0.0
for i in SG_val and j in FG_val:
abv = (((1.05/0.79)*((i - j)/j))*100)
abv_list.append(abv)
return abv_list
find_abv()
print(abv_list)```
Комментарии:
1. Где появляется ошибка? Кстати, я бы рекомендовал убедиться, что оба списка имеют одинаковую длину, а затем использовать цикл диапазона. После этого вы можете просто получить элементы с индексом цикла for
2. Ошибка появляется в строке, где я начинаю свое уравнение — abs = (((1.05… Я ищу, чтобы добавить значения из SG_val и FG_val в места, где i и j находятся в уравнении abv, но я не уверен, как добавить два аргумента одновременно.
Ответ №1:
Вы не можете использовать and
для итерации двух переменных в одном for
цикле. Для этого вы можете использовать zip
функцию:
def find_abv(SG = SG_val, FG = FG_val):
abv_list = []
i = 0.0
j = 0.0
for i, j in zip(SG,FG):
abv = (((1.05/0.79)*((i - j)/j))*100)
abv_list.append(abv)
return abv_list
abv_list = find_abv()
print(abv_list)
Вам также необходимо присвоить результат find_abv()
переменной, чтобы распечатать его, чего вы не делаете, как кажется в вашем коде.
Другое дело, что использование SG_val
и FG_val
в цикле your find_abv
бессмысленно, поскольку у вас есть SG
FG
параметры an в вашей функции.
Комментарии:
1. Спасибо, что это кое-что проясняет! Но в результате я получаю только одно значение. Я надеялся получить список значений, соответствующих каждому из значений SG и FG в исходной словарной записи. Вы знаете, есть ли способ сделать это? Я устал удалять переменные i и j, поскольку они на самом деле не казались мне полезными.
abv_list = [] def find_abv(SG = SG_val, FG = FG_val): for i, j in zip(SG_val, FG_val): abv = (((1.05/0.79)*((i - j)/j))*100) abv_list.append(abv) return abv_list abv_list = find_abv() print(abv_list)
2. Это оператор return . Это должно быть вне цикла. Этого тоже не заметил. Редактирование моего ответа.
Ответ №2:
Вы не можете использовать цикл for для прямого перебора нескольких списков. В настоящее время ваша функция пытается выполнить итерацию (SG_val and j in FG_val)
, которая сама по себе является логическим значением и поэтому не может быть повторена.
Если в двух списках всегда будет одинаковое количество элементов, то вы можете просто перебирать индексы:
# len(SG_val) returns the length of SG_val
for i in range(len(SG_val)):
abv = (((1.05/0.79)*((SG_val[i] - FG_val[i])/FG_val[i]))*100)
abv_list.append(abv)
# put the return outside of the for loop so that it can finish iterating before returning the value
return abv_list
Если списки не всегда будут одинаковой длины, вы можете написать for i in range(len(SG_val) if len(SG_val) <= len(FG_val) else len(SG_val)):
вместо for i in range(len(SG_val)):
, чтобы он повторялся до тех пор, пока не достигнет конца наименьшего списка.
Кроме того, чтобы вывести значение, возвращаемое функцией, вы должны присвоить его чему-то, а затем распечатать его или просто распечатать напрямую:
abv_list = find_abv()
print(abv_list)
# or
print(find_abv())