列表理解Python的多个条件语句

时间:2019-02-19 23:12:57

标签: python python-3.x pandas list if-statement

我有一个列表,其中包含要在 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的空列表。

如何解决此问题?

3 个答案:

答案 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]