Operador de conjunto "en" de Python

143

Estoy un poco confundido sobre el inoperador de python para conjuntos.

Si tengo un conjunto sy alguna instancia b, ¿es cierto que b in ssignifica " hay algún elemento xen stal que b == xseatrue "?

Dejas
fuente
77
¿Eres matemático? Describiendo cosas simples de una manera demasiado compleja ...;)
ThiefMaster
13
Científico de la computación. Estoy un poco confundido porque la documentación dice "Prueba x para membresía en s". Para mí eso podría significar "la instancia x está contenida en s" o "existe alguna instancia en s que tiene el mismo valor que x". No sé si se trata de una comparación de identidad o igualdad.
Dejas
66
@Dejas: Como sabe que Python tiene dos operadores de comparación de igualdad y comparación de identidad, debería poder construir un experimento que confirme cada uno. Sería útil si publicaras ese experimento.
S.Lott

Respuestas:

101

Sí, pero también significa hash(b) == hash(x)que la igualdad de los elementos no es suficiente para hacerlos iguales.

Ignacio Vazquez-Abrams
fuente
14
Ok, entonces "¿hay un elemento x en s tal que hash (b) == hash (x) y x == b"?
Dejas
12
Si alguien implementó la función hash de su clase de una manera retorcida, esto es lo que puede obtener (y merecer).
Ugoren
84

Así es. Podrías probarlo en el intérprete así:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False
Niclas Nilsson
fuente
2
Esta no es una prueba muy buena ya que las constantes de cadena a menudo se internan (intente a = 'a'; b = 'a'; a is b). Lo intenté con en su a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b])lugar.
Philipp
11

Sí, puede significar eso, o puede ser un simple iterador. Por ejemplo: Ejemplo como iterador:

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

Del mismo modo como un cheque:

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

editado: editado para incluir conjuntos en lugar de listas y cadenas

Arnab Ghosal
fuente
2
¿Qué tiene esto que ver con los conjuntos?
Ignacio Vazquez-Abrams
bueno, supongo que se puede considerar que una lista o incluso una cadena tienen propiedades similares a un conjunto. Son una colección de elementos.
Arnab Ghosal
1
No, los conjuntos tienen una condición adicional para una verificación de contención que las secuencias no tienen.
Ignacio Vazquez-Abrams
3

Las cadenas, aunque no son settipos, tienen una inpropiedad valiosa durante la validación en los scripts:

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

Espero que esto te ayude a comprender mejor el uso de ineste ejemplo.

Droogans
fuente
2
Eso no es un conjunto. Las cuerdas tampoco son mutables.
Ignacio Vazquez-Abrams
77
... or 'e' or 'es' or 's'. Considere simplemente eliminar esta respuesta inútilmente incorrecta.
Quuxplusone
3

Los conjuntos se comportan de manera diferente a los dictados, debe usar operaciones de conjunto como 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
MortenB
fuente
Eso es interesante. Y una gran aplicación del mundo real también.
Armstrongest