Ensemble vide littéral?

461

[] = vide list

() = vide tuple

{} = vide dict

Existe-t-il une notation similaire pour un vide set? Ou dois-je écrire set()?

Johan Råde
la source
12
vous n'acceptez pas {i for i in []}, n'est-ce pas?
utdemir
3
Je veux juste montrer que tout est possible avec python. Si vous souhaitez créer un ensemble sans utiliser set (), vous pouvez.
utdemir
6
Oui, vous pouvez faire à peu près tout de cent manières différentes. Je n'ajoute pas map(lambda x: x)à mes exemples de code juste pour vous montrer que cela fonctionne non plus. Ce n'est pas non plus un ensemble littéral, c'est juste une compréhension d'ensemble.
130
Une façon stupide qui fonctionne serait {0}-{0}. Ce n'est pas aussi clair que cela set(), mais cela a l'avantage de ressembler à une drôle de paire d'yeux.
wim
10
@Chris {}est un dictionnaire. {0}est un ensemble. {0} - {0}est la différence entre un ensemble et lui-même, qui est l'ensemble vide.
michaelsnowden

Réponses:

519

Non, il n'y a pas de syntaxe littérale pour l'ensemble vide. Vous devez écrire set().

sepp2k
la source
Vous voulez dire qu'il n'y a pas de syntaxe littérale pour l'ensemble vide? Ou pour les décors en général?
Johan Råde
15
Il existe des littéraux définis, mais uniquement dans Python 3.x. Il n'y a pas de littéral pour les ensembles vides de toute façon.
2
@ user763305: Le manuel de langue est assez clair sur ce point. docs.python.org/library/stdtypes.html#set-types-set-frozenset dit "des ensembles non vides ... peuvent être créés en plaçant une liste d'éléments séparés par des virgules entre accolades"
S.Lott
44
En fait, les littéraux définis ont été rétroportés vers Python 2.7, ils ne sont donc pas uniquement disponibles strictement dans Python 3.
Jim Brissom
13
@andy Ce n'est pas un ensemble vide - c'est un ensemble contenant le nombre 1. Vous n'avez pas besoin de la virgule de fin d'ailleurs - c'est seulement requis pour les tuples.
sepp2k
54

Par tous les moyens, veuillez utiliser set() pour créer un ensemble vide.

Mais, si vous voulez impressionner les gens, dites-leur que vous pouvez créer un ensemble vide en utilisant des littéraux et *avec Python> = 3.5 ( voir PEP 448 ) en faisant:

>>> s = {*()}  # or {*{}} or {*[]}
>>> print(s)
set()

c'est fondamentalement une façon de faire plus condensée {_ for _ in ()}, mais ne le faites pas.

Dimitris Fasarakis Hilliard
la source
Pourquoi?! Les performances sont presque identiques:$ python3.7 -m timeit 'set()' 2000000 loops, best of 5: 177 nsec per loop $ python3.7 -m timeit '{*()}' 2000000 loops, best of 5: 171 nsec per loop
ogurets
9
@ogurets, set()est probablement beaucoup plus facile à comprendre (pour les responsables de code), et cela compte souvent plus que les performances. {*()}semble "intelligent" dans un sens presque péjoratif.
benjimin
Hé, c'est intelligent.
Kowalski
46

Juste pour étendre la réponse acceptée:

De la version 2.7et 3.1python a setlittéralement une {}forme d'utilisation {1,2,3}, mais {}lui-même toujours utilisé pour le dict vide.

Python 2.7 (la première ligne n'est pas valide en Python <2.7)

>>> {1,2,3}.__class__
<type 'set'>
>>> {}.__class__
<type 'dict'>

Python 3.x

>>> {1,4,5}.__class__
<class 'set'>
>>> {}.__class__
<type 'dict'>

Plus ici: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes

Reishin
la source
12
Cette réponse est fausse. Il n'y a toujours pas de syntaxe littérale pour représenter un ensemble vide. {}.__class__donnerait toujoursdict
Ninja420
8
@ Ninja420 essayez de lire d'abord avant de commenter, j'ai remarqué que
Reishin
3
La réponse acceptée est toujours correcte et n'est pas obsolète. Il n'y a pas de syntaxe littérale pour l'ensemble vide , il y en a cependant une pour le dictionnaire vide.
AndreasHassing
2
@ AndreasBjørn pour un oui vide, mais pour un non vide, vous obtiendrez une exception PEP8 et une suggestion d'utiliser set literal.
Reishin
en fait, {}.__class__retourne <class 'dict'>'avec pyt3.6, pas<type 'dict'>
klew
6

Cela dépend si vous voulez le littéral pour une comparaison ou pour une affectation.

Si vous voulez rendre un ensemble existant vide, vous pouvez utiliser le .clear()métod, surtout si vous voulez éviter de créer un nouvel objet. Si vous voulez faire une comparaison, utilisez set()ou vérifiez si la longueur est 0.

exemple:

#create a new set    
a=set([1,2,3,'foo','bar'])
#or, using a literal:
a={1,2,3,'foo','bar'}

#create an empty set
a=set()
#or, use the clear method
a.clear()

#comparison to a new blank set
if a==set():
    #do something

#length-checking comparison
if len(a)==0:
    #do something
Brian Minton
la source
8
a=set()ne vide pas l'ensemble , mais crée un nouvel ensemble et l'affecte à a, en écrasant toute valeur précédente.
gerrit
En effet. C'est pourquoi j'ai dit que si vous voulez éviter de créer un nouvel objet, vous devez utiliser clear (). Je suppose que mon commentaire aurait dû être formulé légèrement différemment.
Brian Minton
Il apparaît également que l'utilisation de la a.clear()méthode est légèrement plus rapide que a=set(), et la vérification len(a)==0est légèrement plus rapide que la vérification de l'égalité poura==set()
Brian Minton
3
Au lieu de cela, if len(a)==0:il suffit (et est plus Pythonic) d'écrire juste if a: (edit: ou plutôt, if not a:pour correspondre à la polarité de la condition).
Jim Oldfield
2

Ajout aux idées folles: avec Python 3 acceptant les identificateurs unicode, vous pouvez déclarer une variable ϕ = frozenset()((est U + 03D5) et l'utiliser à la place.

Renato Garcia
la source
4
Le problème est que les setobjets sont mutables, vous vous mettez donc en danger spam = ϕ; spam.add("eggs").
drdaeman
3
si ϕest un frozenset, spam.add("eggs")échoue, car l'objet frozenset n'a pas de addméthode.
Brian Minton
1
@BrianMinton: Mais c'est le comportement prévu. Notez que lorsque quelqu'un écrit les span = ϕdeux spanet ϕpointera vers le même objet, c'est-à-dire id(span) == id(ϕ). Par conséquent, si spam.add("eggs")cela fonctionnait, l' ϕobjet ne serait plus un ensemble vide, et nous reviendrons au problème d'origine comme l'a souligné drdaeman
Renato Garcia
1
@RenatoGarcia Comparez avec le dict littéral vide:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton
1

Oui. La même notation qui fonctionne pour les dict / set non vides fonctionne pour les vides.

Remarquez la différence entre les non-vides dictet les setlittéraux:

{1: 'a', 2: 'b', 3: 'c'}- un certain nombre de paires clé-valeur à l'intérieur fait un dict
{'aaa', 'bbb', 'ccc'}- un tuple de valeurs à l'intérieur fait unset

Donc:

{}== zéro nombre de paires clé-valeur == vide dict
{*()}== vide tuple de valeurs == videset

Cependant, le fait que vous puissiez le faire ne signifie pas que vous devriez le faire. Sauf si vous avez de bonnes raisons, il est préférable de construire explicitement un ensemble vide, comme:

a = set()

NB : Comme ctrueden l'a remarqué dans les commentaires, ce {()}n'est pas un ensemble vide. C'est un ensemble avec 1 élément: un tuple vide.

pycoder
la source
2
{()}n'est pas l'ensemble vide. Il s'agit d'un ensemble singleton avec un élément: un tuple vide. Vous pouvez le vérifier en vérifiant len({()})qui sera 1 ou () in {()}qui le sera True.
ctrueden
1
Oups, vous avez raison! J'ai mis à jour le message: ajouté la note sur le fait de {()}ne pas être un ensemble vide, au cas où quelqu'un d'autre ferait la même erreur. Merci, @ctrueden!
pycoder
-1

Il existe plusieurs façons de créer un ensemble vide en Python:

  1. Utilisation de la méthode set ()
    Il s'agit de la méthode intégrée en python qui crée un ensemble vide dans cette variable.
  2. Utilisation de la méthode clear () (technique d'ingénierie créative LOL)
    Voir cet exemple:

    sets = {"Hi", "How", "are", "You", "All"}
    type (sets) (This Line Output: set)
    sets .clear ()
    print (sets) (Cette sortie ligne: {})
    type (sets) (Cette sortie ligne: set)

Donc, ce sont 2 façons de créer un ensemble vide.

Rencontrez Shah
la source