我想要一个简短的形式,从列表中删除一个元素,并使用以下命令:
>>> a = [1, 2, 3, 4]
>>> val = 3
>>> a.remove(val) if val in a else None
>>> a
>>> [1, 2, 4]
>>> val = 10
>>> a.remove(val) if val in a else None
>>> a
>>> [1, 2, 4]
显然它工作,但它是一个正确的使用三元操作符?
不,这不是python式的三进制用法。
让我们先把这个问题放在一边,看看:
a = [1, 2, 3]
print(a.remove(2))
我们得到了None
,因为.remove()
在原地工作。
现在考虑三进制;为什么我们想要这个?通常是由于对赋值的一些决定:
a = [1, 2, 3]
b = "foo" if a[0] == 1 else "bar"
print(b)
如果我们把这种模型应用到你的三元,你会得到总是None
。这有点类似于对副作用使用列表推导式。
a = [1, 2, 3]
print(a.remove(2) if 2 in a else None)
print(a.remove(10) if 10 in a else None)
如果操作无论如何总是指向return None
,那么任何代码的读者都会问为什么要使用三进制。一定有一些潜在的原因,对吧,因为你有一个else
的情况,即使它实际上是一个无操作,因为没有找到值。但是,作为读者,我无法确定条件是True
还是False
,因为无论哪种情况,我都会得到None
。
如注释中所述,您可以在一行中完成此操作:
a = [1, 2, 3]
if 2 in a: a.remove(2)
print(a)
这里的意图更明确,因为不需要回退三元条件。即便如此,像这样追踪行也是没有意义的,但它比三元制要好。
不仅如此,而且,正如@nineteendo指出的那样,将if
检查压缩到一行会导致linter出现问题:参见CO321和更一般的PEP8