174 votes

L'opérateur de jeu "in" de Python

Je suis un peu confus au sujet du python in pour les ensembles.

Si j'ai un ensemble s et une instance b est-il vrai que b in s signifie " Y a-t-il un élément x en s de telle sorte que b == x es true " ?

101 votes

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

22 votes

Informaticien. Je suis un peu confus car la documentation dit "Tester l'appartenance de x à s". Pour moi, cela pourrait signifier "l'instance x est contenue dans s" ou "il existe une instance 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é.

8 votes

@Dejas : Puisque vous êtes conscient que Python possède deux opérateurs : la comparaison d'égalité et la comparaison d'identité, vous devriez être capable de construire une expérience qui confirme chacun d'eux. Il serait utile que tu publies cette expérience.

119voto

Ignacio Vazquez-Abrams Points 312628

Oui, mais il également signifie hash(b) == hash(x) donc l'égalité des éléments ne suffit pas à les rendre identiques.

18 votes

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

14 votes

Si quelqu'un a implémenté la fonction de hachage de sa classe de manière tordue, voilà ce qu'il pourrait obtenir (et mériter).

4 votes

Je pense que la documentation sur test d'adhésion devrait indiquer plus clairement que l'égalité de hachage est une condition préalable pour set , frozenset y dict . Une amélioration de ce type a été discutée dans un rapport de bogue en 2015, mais il a malheureusement été fermé en 2019 : bugs.python.org/issue23987#msg241661 .

103voto

Niclas Nilsson Points 1910

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 votes

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 is b ). Je l'ai essayé avec a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b]) à la place.

12voto

Arnab Ghosal Points 132

Oui, cela peut signifier cela, 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 que pour un chèque :

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

édité : édité pour inclure les ensembles plutôt que les listes et les chaînes de caractères

3 votes

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

0 votes

Je suppose qu'une liste ou même une chaîne de caractères peut être considérée comme ayant des propriétés similaires à celles d'un ensemble. Il s'agit d'une collection d'éléments.

2 votes

Non, les ensembles ont une condition supplémentaire pour un contrôle de confinement que les séquences n'ont pas.

6voto

MortenB Points 328

Les sets se comportent différemment des dicts, vous devez utiliser des opérations de 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

0 votes

C'est intéressant. Et une grande application du monde réel aussi.

0 votes

C'est précisément le résultat surprenant qui m'a amené ici.

3voto

Droogans Points 2098

Les cordes, bien qu'elles ne soient pas set types, ont un précieux in 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 in avec cet exemple.

3 votes

Ce n'est pas un ensemble. Les chaînes de caractères ne sont pas non plus mutables.

7 votes

... or 'e' or 'es' or 's' . Envisagez de supprimer cette réponse inutilement fausse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X