Utiliser des accolades pour initialiser un ensemble en Python


98

J'apprends python et j'ai une question novice sur l'initialisation des ensembles. Grâce à des tests, j'ai découvert qu'un ensemble peut être initialisé comme ceci:

my_set = {'foo', 'bar', 'baz'}

Y a-t-il des inconvénients à le faire de cette façon, par opposition à la méthode standard de:

my_set = set(['foo', 'bar', 'baz'])

ou est-ce juste une question de style?


2
La documentation le mentionne, mais pas là. Notez que c'est la documentation d'un module obsolète, les ensembles réels sont maintenant intégrés. Il se trouve dans le document "What's New in Python 2.7", et la référence du langage le décrit brièvement: docs.python.org/2/reference/expressions.html#set-displays

@delnan I use python 2.7, so I didn't think to look in the python 3 docs. The link I posted is for 2.7, but it strangely doesn't mention this.
fvrghl

1
I since edited my comment, the 2.7 docs also mention this. The link you posted is outdated, a relic of the past, wrong, deprecated. Forget that it exists and use what it itself tells you to use instead: docs.python.org/2/library/stdtypes.html#set and docs.python.org/2/library/stdtypes.html#frozenset

@delnan Merci de m'avoir aidé. J'ai édité la question pour ne plus dire qu'il n'y a pas de documentation à ce sujet (bien qu'il y ait peu d'exemples mentionnant cela en ligne).
fvrghl

Pour les passants: Pycharm met en garde contre l'utilisation d'un appel de fonction quand on peut utiliser un littéral - il peut y avoir des raisons de performances - alors préférez la manière littérale définie dans le nouveau code
Mr_and_Mrs_D

Réponses:


102

Il y a deux problèmes évidents avec la syntaxe littérale définie:

my_set = {'foo', 'bar', 'baz'}
  1. Il n'est pas disponible avant Python 2.7

  2. Il n'y a aucun moyen d'exprimer un ensemble vide en utilisant cette syntaxe (l'utilisation {}crée un dict vide)

Ceux-ci peuvent être importants ou non pour vous.

La section de la documentation décrivant cette syntaxe est ici .


46

Comparez également la différence entre {}et set()avec un seul mot.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

mais les deux aet bsont des ensembles bien sûr.


4
c'est pourquoi j'aime me rappeler le constructeur d'ensemble set([])plutôt que juste set().
Michael Ekoka

3
set()prenez toujours un seul argument. Un seul itérable.
George Kettleborough

1
@GeorgeKettleborough un seul ou aucun argument, ce dernier pour créer un ensemble vide.
gertvdijk

28

De la documentation Python 3 (il en va de même pour python 2.7 ):

Les accolades ou la fonction set () peuvent être utilisées pour créer des ensembles. Remarque: pour créer un ensemble vide, vous devez utiliser set (), pas {}; ce dernier crée un dictionnaire vide, une structure de données dont nous parlerons dans la section suivante.

en python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

Sachez que {}c'est également utilisé pour map/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

On peut également utiliser une syntaxe complète pour initialiser des ensembles:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])

1

Vous devez faire empty_set = set()pour initialiser un ensemble vide. {}est une diction vide.

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.