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


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.


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

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


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.


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

C'est intéressant. Et une excellente application dans le monde réel.
Armstrongest le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.