Вызов аргументов из 2 отдельных списков в одну функцию

#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())