2012-01-02 2 views
66

Je suis un peu confus au sujet de l'opérateur python dans les ensembles. Si j'ai un ensemble en python s et une instance b, est-il vrai que "b in s" signifie "Y at-il un élément x dans s tel que b == x est vrai"?L'opérateur set "in" de Python

+27

: êtes-vous un mathématicien? Décrire des choses simples d'une manière trop complexe.;) – ThiefMaster

+5

Computer Scientist. Je suis juste un peu confus parce que la documentation dit "Test x pour l'adhésion à 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

+3

@Dejas: Puisque vous êtes conscient que Python a deux opérateurs de comparaison d'égalité et de comparaison d'identité, vous devriez être capable de construire une expérience qui confirme chacun. Cela aiderait si vous postiez cette expérience. –

Répondre

55

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

+7

Ok donc "y a-t-il un élément x dans s tel que hash (b) == hash (x) et x == b"? – Dejas

+0

@Dejas: Correct. –

+4

Si quelqu'un a implémenté la fonction de hachage de sa classe d'une manière tordue, c'est ce qu'il peut obtenir (et mériter). – ugoren

0

Oui. Cela signifie que l'élément donné est dans l'ensemble.

+1

Juste pour être clair cependant. par "est dans l'ensemble" vous voulez dire "a == b" et non "a est b", correct? – Dejas

34

C'est vrai. Vous pouvez l'essayer dans l'interprète comme ceci:

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

>>> 'a' in a_set 
True 

>>>'d' in a_set 
False 
+3

Fyi, 'sets' est obsolète. 'set()' est un builtin depuis un certain temps maintenant. – ThiefMaster

+0

Oh, bien sûr. Désolé :) Je change mon échantillon ... –

+0

Ce n'est pas un très bon test puisque les constantes de chaîne sont souvent internées (essayez 'a = 'a'; b = 'a'; a est b'). Je l'ai essayé avec 'a = (1, 2, 3); b = (1, 2, 3); a == b; hash (a) == hash (b); a est b; un ensemble in ([b]) 'à la place. – Philipp

0

Strings, mais ils ne sont pas set types, ont une propriété in 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 aide à mieux comprendre l'utilisation de in avec cet exemple.

+1

Ce n'est pas un ensemble. Les chaînes ne sont pas mutables non plus. –

+0

Je ne sais pas ce que je pensais ... tu as raison. – Droogans

+3

'... ou 'e' ou 'es' ou 's''. Envisagez simplement de supprimer cette réponse erronée. – Quuxplusone

8

Oui, cela peut vouloir dire, ou cela peut être un simple itérateur. Par exemple: Exemple comme iterator:

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

De même un chèque:

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

sous la direction: edited d'inclure des ensembles plutôt que des listes et des chaînes

+0

Qu'est-ce que cela a à voir avec les ensembles? –

+0

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. –

+1

Non, les ensembles ont une condition supplémentaire pour un contrôle de confinement que les séquences ne vérifient pas. –