Opérateur d'ensemble «in» de Python

143

Je suis un peu confus à propos de l' inopérateur python pour les ensembles.

Si j'ai un ensemble set une instance b, est-il vrai que cela b in ssignifie " y a-t-il un élément xdans stel qui b == xesttrue "?

Dejas
la source
77
Êtes-vous mathématicien? Décrire des choses simples d'une manière trop complexe ..;)
ThiefMaster
13
Informaticien. Je suis juste un peu confus parce que la documentation dit "Tester x pour l'appartenance à s". Pour moi, cela pourrait signifier "l'instance x est contenue dans s" ou "une instance existe dans s qui a la même valeur que x". Je ne sais pas s'il s'agit d'une comparaison d'identité ou d'égalité.
Dejas
6
@Dejas: Puisque vous savez que Python a deux opérateurs Comparaison d'égalité et comparaison d'identité, vous devriez être en mesure de construire une expérience qui confirme chacun. Cela vous aiderait si vous publiez cette expérience.
S.Lott

Réponses:

101

Oui, mais cela signifie aussihash(b) == hash(x) que l'égalité des éléments n'est pas suffisante pour les rendre identiques.

Ignacio Vazquez-Abrams
la source
14
Ok donc "y a-t-il un élément x dans s tel que hash (b) == hash (x) et x == b"?
Dejas
12
Si quelqu'un implémente la fonction de hachage de sa classe de manière tordue, c'est ce qu'il peut obtenir (et mériter).
ugoren
84

C'est vrai. Vous pouvez l'essayer dans l'interpréteur comme ceci:

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

>>> 'a' in a_set
True

>>>'d' in a_set
False
Niclas Nilsson
la source
2
Ce n'est pas un très bon test car les constantes de chaîne sont souvent internées (essayez a = 'a'; b = 'a'; a is b). Je l'ai essayé avec à la a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b])place.
Philipp
11

Oui, cela peut signifier ainsi, ou cela peut être un simple itérateur. Par exemple: Exemple comme itérateur:

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

De même comme chèque:

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

modifié: modifié pour inclure des ensembles plutôt que des listes et des chaînes

Arnab Ghosal
la source
2
Qu'est-ce que cela a à voir avec les ensembles?
Ignacio Vazquez-Abrams
eh bien, je suppose qu'une liste ou même une chaîne peut être considérée comme ayant des propriétés similaires à un ensemble. Ils sont une collection d'éléments.
Arnab Ghosal
1
Non, les ensembles ont une condition supplémentaire pour un contrôle de confinement, contrairement aux séquences.
Ignacio Vazquez-Abrams
3

Les chaînes, bien qu'elles ne soient pas des settypes, ont une inpropriété précieuse lors de la validation dans les 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

J'espère que cela vous aidera à mieux comprendre l'utilisation de incet exemple.

Droogans
la source
2
Ce n'est pas un ensemble. Les chaînes ne sont pas non plus mutables.
Ignacio Vazquez-Abrams
7
... or 'e' or 'es' or 's'. Pensez simplement à supprimer cette mauvaise réponse inutile.
Quuxplusone
3

Les sets se comportent différemment des dicts, vous devez utiliser des opérations set comme 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
la source
C'est intéressant. Et une excellente application dans le monde réel.
Armstrongest le