使用Python逻辑运算符0的问题

时间:2012-01-06 08:40:20

标签: python

从本网站上的其他人那里获取小费,我一直在使用逻辑运算符来表达列表理解中的条件逻辑,作为使用if语句的完整for循环的快捷方式。

例如,如果我有一个列表[1,0,0,1,1]我想变成[“是”,“否”,“否”,“是”,“是”]我可以这样做:

original = [1, 0, 0, 1, 1]
new = [((x==1) and "Yes") or "No" for x in original]

我遇到的问题是,当我以这种方式使用逻辑运算符0时,我得到了一些非常奇怪的结果。无论我是否使用列表理解,结果都会发生。

这些:

print((True and 1.0) or "Wrong")
print((True and -1.0) or "Wrong")
print((True and "1.0") or "Wrong")
print((True and 1) or "Wrong")

正确(我认为)输出:

1.0
-1.0
1.0
1

然而这些:

print((True and 0) or "Wrong")
print((True and 0.0) or "Wrong")

输出:

Wrong
Wrong

我认为Python隐式地将0和0.0都转换为布尔值False,并将任何其他类型的任何其他值转换为True

有人可以确认是否: 一个。情况就是这样和/或 湾有没有办法实现我在列表理解中的另一种方式(使用lamda或其他东西)

非常感谢 克里斯

2 个答案:

答案 0 :(得分:5)

0在您的短路评估中返回false(您可以通过bool(0)进行测试,返回false)。我认为这更简单:

new = ["yes" if x else "no" for x in list]

答案 1 :(得分:1)

以下值被解释为false:False,None,所有类型的数字零,以及空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。 (有关更改此方法的方法,请参阅非零()特殊方法。)

摘自http://docs.python.org/reference/expressions.html#boolean-operations