2012-01-02 20 views
66

Sono un po 'confuso riguardo al python in operator per i set.Operatore set "in" Python

Se ho un set in python e qualche istanza b, è vero che "b in s" significa "c'è qualche elemento x in s tale che b == x è vero"?

+27

Sei un matematico? Descrivendo le cose semplici in un modo troppo complesso ..;) – ThiefMaster

+5

Computer Scientist. Sono solo un po 'confuso perché la documentazione dice "Test x per l'appartenenza a s". Per me ciò potrebbe significare "l'istanza x è contenuta in s" o "esiste qualche istanza in s che ha lo stesso valore di x". Non so se si tratti di un'identità o di un confronto di uguaglianza. – Dejas

+3

@Dejas: Dato che sei consapevole del fatto che Python ha due operatori Equality confronto e confronto delle identità, dovresti essere in grado di costruire un esperimento che ne confermi ciascuno. Sarebbe utile se hai postato quell'esperimento. –

risposta

55

Sì, ma anche significa hash(b) == hash(x), quindi l'uguaglianza degli articoli non è sufficiente per renderli uguali.

+7

Ok così "c'è un elemento x in s tale che hash (b) == hash (x) e x == b"? – Dejas

+0

@Dejas: corretto. –

+4

Se qualcuno ha implementato la funzione hash della sua classe in modo distorto, questo è ciò che può ottenere (e meritare). – ugoren

0

Sì. Significa che l'elemento dato è nell'insieme.

+1

Giusto per essere chiari però. per "è nel set" intendi "a == b" e non "a is b", corretto? – Dejas

34

Proprio così. Si potrebbe provare l'interprete in questo modo:

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

>>> 'a' in a_set 
True 

>>>'d' in a_set 
False 
+3

Fyi, 'sets' è deprecato. 'set()' è un builtin per un bel po 'di tempo. – ThiefMaster

+0

Oh, certo. Scusate :) Cambio il mio campione ... –

+0

Questo non è un test molto buono poiché le costanti di stringa sono spesso internate (provate 'a = 'a'; b = 'a'; a è b'). L'ho provato con 'a = (1, 2, 3); b = (1, 2, 3); a == b; hash (a) == hash (b); a è b; a invece in set ([b]). – Philipp

0

stringhe, anche se non sono set tipi, hanno un valore in proprietà durante la convalida negli script:

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 

Spero che questo aiuta a capire meglio l'uso di in con questo esempio.

+1

Questo non è un set. Né le stringhe sono mutabili. –

+0

Non so cosa stavo pensando ... hai ragione. – Droogans

+3

'... o 'e' o 'es' o 's''. Prendi in considerazione l'eliminazione di questa risposta inutilmente sbagliata. – Quuxplusone

8

Sì, può significare così, o può essere un semplice iteratore. Per esempio: Esempio come iteratore:

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

Allo stesso modo come un assegno:

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

Modificato: modificato per includere insiemi piuttosto che liste e stringhe

+0

Cosa c'entra questo con gli insiemi? –

+0

beh suppongo che una lista o anche una stringa possano essere considerate come aventi proprietà simili a un set. Sono una raccolta di elementi. –

+1

No, i set hanno una condizione aggiuntiva per un controllo di contenimento che le sequenze no. –