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

上記のコード構造の簡略実装は何ですか? これを行うためのより良い/エレガント/便利な方法はありますか?

4

4 に答える 4

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]
于 2012-09-24T14:41:55.747 に答える
4

これは、max()ビルトインを使用してリスト内包表記を展開することで簡単に解決できます。

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])
于 2012-09-24T14:41:21.300 に答える
2

と で健全性チェックをmin()行いmax()ます。

v1 = max(0, A)
于 2012-09-24T14:41:29.553 に答える
0

mgilson の優れた回答の代わりに、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
于 2012-09-24T16:00:01.670 に答える