问题描述
我正在尝试通过使用两个单独列表中的变量(我从词典条目中获取)来计算某些啤酒的酒精度(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_val
和find_abv
是没有意义的,因为您有SG
和FG
参数在您的功能中。
您不能使用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