将来自2个单独列表的参数调用到一个函数中

问题描述

我正在尝试通过使用两个单独列表中的变量(我从词典条目中获取)来计算某些啤酒的酒精度(abv)。我很难将两个列表中的值都应用于我对于abv的方程式中(并且可能无法使用and语句像下面的for语句那样进行for循环)。是否可以从两个单独的列表中获取变量,然后将它们归入一个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.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)```

解决方法

您不能使用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_valfind_abv是没有意义的,因为您有SGFG参数在您的功能中。

,

您不能使用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()) ,以便迭代直到最小列表的末尾。

此外,要输出该函数返回的值,您必须将其分配给某个东西,然后打印它或直接打印它:

strCommand = "Powershell -ExecutionPolicy Bypass -Command $FilesInPathway = get-childitem -path " & """" & dataPacket.filePath & """" & " -recurse -Attributes !Directory; foreach ($file in $FilesInPathway){$tempName = $file.name; $tempName = $tempName.replace(" & """" & dataPacket.stringOld & """" & "," & """" & dataPacket.stringNew & """" & "); Rename-Item $file.fullname $tempName}"
Set WshShell = CreateObject("WScript.Shell")
strOutput = WshShell.Run(strCommand,True)
MsgBox strOutput