L'operatore "in" set di Python


143

Sono un po 'confuso riguardo inall'operatore python per i set.

Se ho un set se qualche istanza b, è vero che b in ssignifica " c'è qualche elemento xin stale che b == xètrue "?


77
Sei un matematico? Descrivere cose semplici in un modo troppo complesso ..;)
ThiefMaster

13
Informatico. 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 un'istanza in s che ha lo stesso valore di x". Non so se si tratti di un confronto tra identità o uguaglianza.
Dejas,

6
@Dejas: poiché sei consapevole che Python ha due operatori di confronto di uguaglianza e confronto di identità, dovresti essere in grado di costruire un esperimento che confermi ciascuno. Sarebbe utile se hai pubblicato quell'esperimento.
S. Lott

Risposte:


101

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


14
Ok quindi "esiste un elemento x in s tale che hash (b) == hash (x) e x == b"?
Dejas,

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

84

Giusto. Potresti provarlo nell'interprete in questo modo:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False

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

11

Sì, può significare così, oppure può essere un semplice iteratore. Ad 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 controllo:

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

modificato: modificato per includere set anziché elenchi e stringhe


2
Cosa c'entra questo con i set?
Ignacio Vazquez-Abrams,

bene suppongo che un elenco o anche una stringa possano essere considerati come aventi proprietà simili a un set. Sono una raccolta di elementi.
Arnab Ghosal,

1
No, gli insiemi hanno una condizione aggiuntiva per un controllo di contenimento che le sequenze non hanno.
Ignacio Vazquez-Abrams,

3

Le stringhe, sebbene non siano settipi, hanno una inproprietà preziosa 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 ti aiuti a capire meglio l'uso di inquesto esempio.


2
Questo non è un set. Né le stringhe sono mutabili.
Ignacio Vazquez-Abrams,

7
... or 'e' or 'es' or 's'. Considera solo di eliminare questa risposta inutilmente sbagliata.
Quuxplusone,

3

Gli insiemi si comportano in modo diverso rispetto ai dicts, devi usare operazioni come issubset ():

>>> k
{'ip': '123.123.123.123', 'pw': 'test1234', 'port': 1234, 'debug': True}
>>> set('ip,port,pw'.split(',')).issubset(set(k.keys()))
True
>>> set('ip,port,pw'.split(',')) in set(k.keys())
False

Interessante. E anche un'ottima applicazione nel mondo reale.
Armstrongest
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.