2012-01-02 11 views
66

私は、演算子の中のPythonについて少し混乱しています。Pythonの "in"集合演算子

もし私がPythonといくつかのインスタンスbでセットを持っていれば、 "b in s"は "b == xが真であるようなsの要素xがある"ということを意味しますか?

+27

よりもセットが含まれるように編集したあなたは数学者か?非常に複雑な方法で単純なものを記述する;) – ThiefMaster

+5

コンピュータ科学者。ドキュメントに「xのメンバーシップをテストする」と書かれているので、ちょっと混乱しています。私には、「インスタンスxはsに含まれている」または「xと同じ値を持つインスタンスに存在している」ことを意味する可能性があります。私はこれがアイデンティティか同等かどうかはわかりません。 – Dejas

+3

@Dejas:Pythonには2つの演算子Equalityの比較とIDの比較があることを知っているので、それぞれを確認する実験を構築できるはずです。あなたがその実験を投稿した場合、それは役に立ちます。 –

答えて

55

はい、しかしでもhash(b) == hash(x)を意味するので、項目の平等はそれらを同じにするには不十分です。

+7

これで、ハッシュ(b)==ハッシュ(x)とx == bのような要素xがsにありますか? – Dejas

+0

@Dejas:正しい。 –

+4

誰かが自分のクラスのハッシュ関数をねじれた方法で実装した場合、これが彼が得る(そして値する)ものです。 – ugoren

0

はい。これは、指定された要素がセット内にあることを意味します。

+1

ちょっとはっきりしています。あなたは "a == b"を意味し、 "a is b"は意味しません。 – Dejas

34

そうです。あなたは、このようなインタプリタでそれを試みることができる:

>>> a_set = set(['a', 'b', 'c']) 

>>> 'a' in a_set 
True 

>>>'d' in a_set 
False 
+3

Fyi、 'sets'は推奨されていません。 'set()'はかなりの時間の間組み込みです。 – ThiefMaster

+0

もちろん、ああ。申し訳ありません:私は私のサンプルを変更します... –

+0

これは非常に良いテストではありません。なぜなら文字列定数はしばしばインターンされるからです( 'a = 'a'; b = 'a'; aはb')。私は 'a =(1,2,3)で試しました。 b =(1,2,3); a == b;ハッシュ(a)==ハッシュ(b); aはbである。 a in set([b]) 'を実行します。 – Philipp

0

ストリングス、彼らはsetタイプではありませんが、スクリプトで検証中に貴重なin性質を持っている:

yn = input("Are you sure you want to do this? ") 
if yn in "yes": 
    #accepts 'y' OR 'e' OR 's' OR 'ye' OR 'es' OR 'yes' 
    return True 
return False 

私は、これはあなたがよりよく理解するのに役立ちます願っていますこの例でのinの使用。

+1

これはセットではありません。文字列も変更できません。 –

+0

私は何を考えていたのか分かりません...あなたは正しいです。 – Droogans

+3

'...または 'e'または 'es'または 's''。この無意味な間違いを削除するだけと考えてください。 – Quuxplusone

8

はい、そうであっても簡単なイテレータであってもかまいません。たとえば、次のように イテレータとして例:同様に

a=set(['1','2','3']) 
for x in a: 
print ('This set contains the value ' + x) 

チェックとして:編集した

a=set('ILovePython') 
if 'I' in a: 
print ('There is an "I" in here') 

:むしろ、リストや文字列

+0

これはセットと何が関係していますか? –

+0

よく、私はリストや文字列でも、同様のプロパティを持つと見なすことができます。それらは要素の集まりです。 –

+1

いいえ、セットにはシーケンスが含まれない包含チェックのための追加条件があります。 –