Operador de conjunto "in" do Python


143

Estou um pouco confuso sobre o inoperador python para conjuntos.

Se eu tenho um conjunto se alguma instância b, é verdade que b in ssignifica " existe algum elemento xno sque b == xétrue "?


77
Você é matemático? Descrevendo coisas simples de uma forma excessivamente complexa ..;)
ThiefMaster

13
Cientista da computação. Estou um pouco confuso porque a documentação diz "Teste x para associação a s". Para mim, isso poderia significar "a instância x está contida em s" ou "alguma instância existe em s com o mesmo valor que x". Não sei se isso é uma comparação de identidade ou igualdade.
Dejas

6
@ Dejas: Como você está ciente de que o Python possui dois operadores Comparação de igualdade e comparação de identidade, você poderá construir um experimento que confirme cada um. Ajudaria se você postasse essa experiência.
S.Lott

Respostas:


101

Sim, mas também significa hash(b) == hash(x), portanto, a igualdade dos itens não é suficiente para torná-los iguais.


14
Ok, então "existe um elemento x em s tal que hash (b) == hash (x) ex = = b"?
Dejas

12
Se alguém implementou a função hash de sua classe de maneira distorcida, é isso que ele pode obter (e merece).
ugoren

84

Está certo. Você pode tentar no intérprete assim:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False

2
Este não é um teste muito bom, pois as constantes de seqüência de caracteres são frequentemente internadas (try a = 'a'; b = 'a'; a is b). Eu tentei com isso a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b]).
Philipp

11

Sim, pode significar isso ou pode ser um iterador simples. Por exemplo: Exemplo como iterador:

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

Da mesma forma como um cheque:

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

editado: editado para incluir conjuntos em vez de listas e strings


2
O que isso tem a ver com conjuntos?
Ignacio Vazquez-Abrams

bem, suponho que uma lista ou mesmo uma string possa ser considerada como tendo propriedades semelhantes a um conjunto. Eles são uma coleção de elementos.
Arnab Ghosal

1
Não, os conjuntos têm uma condição adicional para uma verificação de contenção que as seqüências não possuem.
Ignacio Vazquez-Abrams

3

As strings, embora não sejam settipos, têm uma inpropriedade valiosa durante a validação em 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 isso ajude você a entender melhor o uso indeste exemplo.


2
Isso não é um conjunto. Nem as cordas são mutáveis.
Ignacio Vazquez-Abrams

7
... or 'e' or 'es' or 's'. Considere apenas excluir essa resposta inutilmente errada.
Quuxplusone

3

Os conjuntos se comportam de maneira diferente dos dict, você precisa usar operações 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

Isso é interessante. E um ótimo aplicativo do mundo real também.
Armstrongest
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.