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.