当条件不是布尔值时,在列表推导式中如何使用"else"?

4
给定一个列表,例如:
a = ["No", 1, "No"]

我希望您能将这个列表转换成一个新的列表(或者只是重新分配这个列表),使得每个“No”都被转换成0,例如。
[0,1,0]

如果我尝试以下列表推导式:
[0 for i in a if i =="No"]

这显然会导致一个列表,其中省略了所有不是“No”的元素。
[0,0]

如果我按照这里给出的方法进行操作:

[0 if "No" else i for i in a]

这让我得到:
[0, 0, 0]

我猜这是因为“否”等于True

我对列表推导式中if/else的用法有什么误解吗?


1
还涉及到:不一致的理解语法? - Martijn Pieters
1个回答

4

使用 == 运算符将其转换为布尔表达式

>>> a = ["No", 1, "No"]
>>> [0 if i == "No" else i for i in a]
[0, 1, 0]

或者另一种方法是:
>>> [[0, i][i != "No"] for i in a]
[0, 1, 0]

这是行得通的,因为i != "No"返回一个布尔值,可以将其解释为1表示True和0表示False。然后使用它来访问列表[0, i]中的特定元素。

2
[int(i != "No") for i in a] 或者 [[1,0 ][i == "No"] for i in a] ;) - Padraic Cunningham
1
呵呵。@Padraic,好聪明的技巧。但是楼主想要打印原始列表中的那个项目,所以不能在这里使用它。:( - Bhargav Rao
2
我猜 [[0, i][i != "No"] for i in a] 应该可以解决问题 - Padraic Cunningham
1
@Padraic 嗯。谢谢你。 - Bhargav Rao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接