2011-11-28 2 views
5

私は要素がセット内にすでに存在していたかどうかをテストする「を追加設定するには」の操作によって返されたブール値を使用したい:"add to set"はjavaでbooleanを返します - pythonについてはどうですか? Javaでは

if (set.add("x")) { 
    print "x was not yet in the set"; 
} 

私の質問があり、のように便利なものがありますPython?試しました

z = set() 
if (z.add(y)): 
    print something 

しかし、何も印刷されません。何か不足していますか?どうも!

+2

コンソールで 'type(z.add(y))'を実行すると、これらのことを自分で確認できます。ここでの結果は '' – Oliver

答えて

7

Pythonでは、set.add()メソッドは何も返しません。あなたはnot in演算子を使用する必要があります。

z = set() 
if y not in z: # If the object is not in the list yet... 
    print something 
z.add(y) 

場合本当にあなただけのブール値保存し、それを追加する前にオブジェクトがセット内にあったかどうかを知る必要があります。しかし

z = set() 
was_here = y not in z 
z.add(y) 
if was_here: # If the object was not in the list yet... 
    print something 

を、私はあなたがそれを必要とするとは思わないと思う。

これはPythonの規約です。メソッドによってオブジェクトが更新されると、Noneが返されます。この規約を無視することができます。また、「野生の中に」違反する方法もあります。しかし、一般的に認められている大会です:私はそれに固執し、それを念頭に置くことをお勧めします。

+0

です。良い答えですが、Javaに相当するのは 'yがz:print something'であると思います。 –

+0

@ MichaelJ.Barberあなたは完全に正しいです。ありがとうございました!質問が更新されました。 – brandizzi

0

私が推測するように、Pythonでは、基本的に必要に応じてyをセットに追加して何も返しません。あなたは追加が何かを変更するかどうか知りたい場合は、yが既にzに入っているかどうかをテストできます。ここで

あなたがiPythonに行うことができますいくつかのテスト:一般

In [2]: z = set() 

In [3]: y = 4 

In [4]: z.add(y) 

In [5]: t = z.add(y) 

In [6]: t 

In [7]: print t 
None 
2

、Pythonは副作用との条件を使用しないようにしようとします。つまり、条件は単なるテストでなければならず、データを変更する操作は単独で実行する必要があります。

私はそれを条件に副作用を使用するために、時には便利だと同意するが、いや、この場合には、以下を行う必要があります。

​​

は個人的に私もそれならば、if y not in z:の簡単な表現を好みますもう1行のコードを取り上げ、後でコードを読むときには精神的に解析することは少なくなります。

0

add()は常にバックNoneを与えるが、「賢く」サブクラスを使用してからあなたを防ぐためには何もありません:

class sset(set): 
    """return True if on add if an object was really added (and not in yet)""" 
    def add(self, val): 
     if val in self: 
      return True 
     set.add(self, val) 
     return False 

これは、あなたが書くことができます:

s = sset() 
if s.add('1'): 
    print('try 1') 
if s.add('1'): 
    print('try 2') 

と実行時にtry 2が表示されます。

は、これは簡単に非効率性を含めることができます@ brandizzi年代のように複数行のコードを繰り返さないようにします。

:yは、それがすでにある場合でも追加されると、非効率的である

z = set() 
was_here = y not in z 
z.add(y) 
if was_here: # If the object was not in the list yet... 
    print something 

それは 何かのようにする必要がありますsset()

z = set() 
was_here = y not in z 
if not was_here: 
    z.add(y) 
else: # If the object was not in the list yet... 
    print something 

これはに減らすことができます。

z = sset() 
if z.add(y): # If the object was not in the list yet... 
    print something 
関連する問題