2016-07-25 13 views
1

JavaのSet.add関数は、指定された要素がまだセットに含まれていない場合はtrueのブール値を返します。PythonはJavaのSet.add()と同じですか?

PythonのSet.addには戻り値がありません。

同じことをしたい場合はPythonのように見えますが、最初にセットに含まれているかどうかをチェックし、そうでない場合は追加しなければなりません。

これを行う簡単な方法はありますか(1ライナーが好ましい)?

参考:
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#add(E) https://docs.python.org/2/library/sets.html#sets.Set

+0

pythonでは、既にセットに含まれているものを追加すると、複製は追加されません。 – pwnsauce

+1

@pwnsauce:Javaでは実行されません。しかし、 'Set.add()'メソッドは、要素がすでに存在しているかどうかを示しています。コードを少し単純化することができます。もちろん、コードシンプルさについては、Javaが得られるすべての助けが必要です。 –

答えて

3

なかった場合は、ワンライナーをしたい場合はwhat_everあなたは、セットに真だった場合

the_set.add(what_ever) or True if what_ever not in the_set else False 

これはFalseを返しますoradd要素がまだセットされていない場合にのみ(短絡評価)、notを使用して戻り値を逆変換し、同時にboolを強制的に使用することができますあなたのそのワンライナーを把握するのは非常に簡単ではないかもしれないので、

>>> s = set() 
>>> not(42 in s or s.add(42)) 
True 
>>> not(42 in s or s.add(42)) 
False 
>>> s 
set([42]) 

しかし、および:Noneは、それが呼び出された場合Trueに、addによって返され、それ以外の場合だけinチェックの結果を反転NG 2回挿入する値を書き込む必要があります。おそらくそれを関数にする必要がありますし、使用する線の数はそれほど多くありません。

def in_or_add(s, x): 
    return not(x in s or s.add(x)) 
2

いいえ、Pythonの集合の実装は、そのような方法がありません。

if obj not in setobj: 
    setobj.add(obj) 

か、私は通常、何をすべきかを:あなたは別に存在をテストする必要があります述べたように

class SetWithPresenceCheck(set): 
    def add(self, value): 
     not_present = value not in self 
     super(SetWithPresenceCheck, self).add(value) 
     return not_present 

注:

if obj in setobj: 
    return # or break out of a loop, etc. 

# handle the case where the set doesn't have the object yet. 

あなたはいつもsetタイプをサブクラス化することができます本当の理由Set.add()がブール値を返した場合、アトミック操作を追加してテストすることです。インタフェースの実装は(オプションで)メソッドを同期させ、呼び出し元が競合状態を回避できるようにします。 Pythonのビルトインセットは、スレッドセーフな約束はしていません。とにかく

-1

ユニオン演算子は、とにかく追加するよりはるかに高速です。

>>> set_a = set('pqrs') 
>>> set_b = ['t', 'u', 'v'] 
>>> set_a |= set(set_b) 
>>> set_a 
set(['p','q','r','s','t','u','v']) 
+0

ユニオンは、その要素が追加される前に存在していたかどうかを通知しません。そして、あなたがしたいことが** **一つの**要素を追加するだけなら、なぜ全体のセットを作るのですか? –

+0

@MartijnPieters:tue、しかしOPは要素をセットに追加したい。連合は彼の目的を果たすだろう。 – Shravan40

+0

いいえ、*ワンステップ*で追加するときに要素が既に存在していた場合、OPはその旨を伝えたいと考えています。 –

-1

は多分三項条件演算子と:それは

+0

これは無効な構文です。代入( 'bool_already_in = True')は式ではなく*別の式の中に入れ子にすることはできません。 –

+1

これで、別のステートメントで 'None'または' False'をテストする必要があります。これは別の封じ込めチェックよりも役に立ちません。 –

+0

@MartijnPietersはい、しかし、あなたは 'java:set.add()'で同じことをしなければなりませんでしたか? set.add()がセットに含まれていない場合は値を追加し、TrueまたはFalseを返します。ちょうどこのように – pwnsauce

関連する問題