我从这个网站上的其他人那里学到了一些技巧,我一直在使用逻辑运算符来表达列表理解中的条件逻辑,以此作为在if语句中使用full for循环的捷径。
例如,如果我有一个列表1,0,0,1,1,我想把它变成"Yes","No","No","Yes","Yes“,我可以这样做:
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
有没有人能确认一下: a.是这样的和/或b.有没有其他方法来实现我在列表理解中想要的东西(使用lamda或其他方法)
非常感谢Chris
发布于 2012-01-06 16:45:55
是的,0在短路评估中返回false (您可以通过返回false的bool(0)进行测试)。我认为这要简单得多:
new = ["yes" if x else "no" for x in list]发布于 2012-01-06 16:47:40
以下值被解释为false: False、None、所有类型的数字零以及空字符串和容器(包括字符串、元组、列表、字典、集合和frozensets)。所有其他值都被解释为true。(有关更改这一点的方法,请参阅非零()特殊方法。)
节选自http://docs.python.org/reference/expressions.html#boolean-operations
https://stackoverflow.com/questions/8755299
复制相似问题