从本网站上的其他人那里获取小费,我一直在使用逻辑运算符来表达列表理解中的条件逻辑,作为使用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或其他东西)
非常感谢 克里斯
答案 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