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 "?


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.


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

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


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.


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

Eso es interesante. Y una gran aplicación del mundo real también.
— Armstrongest
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.