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?

fvrghl
la source
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 .

bgporter
la source
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.

Thruston
la source
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', '{', '}'])
0x90
la source
1

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

Arjjun
la source