2012-09-24 38 views
4
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 

上述代碼結構的簡寫實現是什麼? 有沒有更好/優雅/方便的方法來做到這一點?檢查python中的多變量大於零

+1

值得一提的是''CapWords''在Python通常保留給類 - 檢查[Python的風格指南(PEP-8 )](http://www.python.org/dev/peps/pep-0008/)獲取更多信息。 –

+1

我很確定python社區會建議像'A,B,C,D'這樣的晦澀的變量名:^)。 – mgilson

回答

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功能蟒蛇三元運算符,它看起來像:

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

+1使用'map'和'lambda'來完成列表理解沒有問題。 – chucksmash

+1

@FogleBird - 感謝您的編輯。我同意。 – mgilson

+0

非常感謝 – Asif

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]) 
+6

'(max(x,0)for [A,B,C,D]中的x)'更可讀的恕我直言。 – delnan

+0

約定 - 列表comp比較容易閱讀。 –

+0

@delnan我同意! –

2

完整性檢查與min()max()

v1 = max(0, A) 
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