我有一个列表,其中包含要在 2个条件下进行操作的元素。
一个条件是,如果元素为负,则将范数函数乘以-1;如果元素为正,则使范数函数为正。
values
的列表如下:
print(values)
-97476.70633454417
-93170.30642401175
-89901.82679086612
-87187.62533194348
-87269.09594982903
-85513.31676486236
-83545.26529198853
-82411.91255123452
-81620.01849452594
如您所见,它们都是阴性的(在本实验中)。
代码如下:
norm_BIC = [(-1.0) * float(i)/max(values) for i in values if i < 0 or float(i)/max(values) for i in values if i > 0]
如果我在or
语句之前运行代码,它将起作用:
norm_BIC = [(-1.0) * float(i)/max(values) for i in values if i < 0]
这意味着所有后续操作均不起作用,因为在norm_BIC
之后运行时,我得到or
的空列表。
如何解决此问题?
答案 0 :(得分:2)
似乎您只是在过滤掉负值并将其变为正值。 abs 函数采用绝对值,使输入为正。
会
norm_BIC = [ abs(float(i))/max(values) for i in values]
不能解决您的问题吗?
答案 1 :(得分:1)
您应该使用else子句:
norm_BIC = [(-1.0) * float(i)/max(values) if i < 0 else float(i)/max(values) for i in values]
答案 2 :(得分:1)
要在列表理解中实现“ this 或 that”,您需要使用if
表达式。这使您可以按预期添加else
子句—
values = [
-97476.70633454417,
-93170.30642401175,
-89901.82679086612,
-87187.62533194348,
-87269.09594982903,
-85513.31676486236,
-83545.26529198853,
-82411.91255123452,
-81620.01849452594,
]
norm_BIC = [(-1.0) * float(i)/max(values) if i < 0 else float(i)/max(values) for i in values if i > 0]
此处的语法不是列表理解所特有的,请将此if
表达式进行比较-
a = 10 if b < 10 else 20
在没有最后一个if
的情况下运行示例值
norm_BIC = [(-1.0) * float(i)/max(values) if i < 0 else float(i)/max(values) for i in values]
我得到以下输出。
[-1.1942744945724522,
-1.1415129295794078,
-1.1014678561595233,
-1.0682137414339221,
-1.0692119109931586,
-1.0477002865491576,
-1.0235879240531134,
-1.0097022038381638,
-1.0]
如果只想确保计算结果为正,则可以使用内置的abs()
函数。
norm_BIC = [abs(float(i)/max(values)) for i in values]