检查python中是否有多个大于零的变量

时间:2012-09-24 14:39:52

标签: python

A = 200
B = -140
C = 400
D = -260

if A < 0:
   v1 = 0
else:
   v1 = A

if B < 0:
   v2 = 0
else:
   v2 = B

 if C < 0:
   v3 = 0
else:
   v3 = C

if D < 0:
   v4 = 0
else:
   v4 = C

上述代码结构的简写实现是什么? 有没有更好/更优雅/方便的方法来做到这一点?

4 个答案:

答案 0 :(得分:13)

A = 200
B = -140
C = 400
D = -260

v1, v2, v3, v4 = [x if x > 0 else 0 for x in (A, B, C, D)]

如果您更喜欢将max函数用于python三元运算符,它将如下所示:

v1, v2, v3, v4 = [max(x, 0) for x in (A, B, C, D)]

但是,如果您计划将所有这些变量视为相同,那么您可能需要考虑将它们放在列表/元组中。

values = [200, -140, 400, -260]
values = [max(x, 0) for x in values]

答案 1 :(得分:4)

使用the max() builtin并解压缩list comprehension可以轻松解决此问题。

v1, v2, v3, v4 = [max(x, 0) for x in [a, b, c, d]]

另一种解决方案是使用map()函数 - 但这不太可读:

v1, v2, v3, v4 = map(lambda x: max(x,0), [a, b, c, d])

答案 2 :(得分:2)

使用min()max()进行完整性检查。

v1 = max(0, A)

答案 3 :(得分:0)

作为mgilson's excellent answer的替代方法,您可以将int子类化为自定义类来实现此目标

>>> class V(int):
...    def __new__(cls,val,**kwargs):
...       return super(V,cls).__new__(cls,max(val,0))

然后直接使用它:

>>> A=V(200)
200
>>> B=V(-140)
0
>>> [V(i) for i in [200, -140, 400, -260]]
[200, 0, 400, 0]     
>>> A,B,C,D = [V(i) for i in [200, -140, 400, -260]]

以这种方式执行此操作的唯一好处是,您可以适当地覆盖__sub____add__ __mul__,然后您的V ints将始终大于0即使你有a=V(50)-100

示例:

>>> class V(int):
...    def __new__(cls,val,**kwargs):
...       return super(V,cls).__new__(cls,max(val,0)) 
...    def __sub__(self,other):
...       if int.__sub__(self,other)<0:
...         return 0
...       else:
...         return int.__sub__(self,other) 
>>> a=V(50)
>>> b=V(100)
>>> a-b                #ordinarily 50-100 would be -50, no?
0