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().
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 utiliserset() 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.
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)
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 setif a==set():#do something#length-checking comparisonif len(a)==0:#do something
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.
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.
{()}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:
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.
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)
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.{0}-{0}
. Ce n'est pas aussi clair que celaset()
, mais cela a l'avantage de ressembler à une drôle de paire d'yeux.{}
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.Réponses:
Non, il n'y a pas de syntaxe littérale pour l'ensemble vide. Vous devez écrire
set()
.la source
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:c'est fondamentalement une façon de faire plus condensée
{_ for _ in ()}
, mais ne le faites pas.la source
$ 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
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.Juste pour étendre la réponse acceptée:
De la version
2.7
et3.1
python aset
litté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)
Python 3.x
Plus ici: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
la source
{}.__class__
donnerait toujoursdict
{}.__class__
retourne<class 'dict'>'
avec pyt3.6, pas<type 'dict'>
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, utilisezset()
ou vérifiez si la longueur est 0.exemple:
la source
a=set()
ne vide pas l'ensemble , mais crée un nouvel ensemble et l'affecte àa
, en écrasant toute valeur précédente.a.clear()
méthode est légèrement plus rapide quea=set()
, et la vérificationlen(a)==0
est légèrement plus rapide que la vérification de l'égalité poura==set()
if len(a)==0:
il suffit (et est plus Pythonic) d'écrire justeif a:
(edit: ou plutôt,if not a:
pour correspondre à la polarité de la condition).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.la source
set
objets sont mutables, vous vous mettez donc en dangerspam = ϕ; spam.add("eggs")
.ϕ
est un frozenset,spam.add("eggs")
échoue, car l'objet frozenset n'a pas deadd
méthode.span = ϕ
deuxspan
etϕ
pointera vers le même objet, c'est-à-direid(span) == id(ϕ)
. Par conséquent, sispam.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>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
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
dict
et lesset
littéraux:{1: 'a', 2: 'b', 3: 'c'}
- un certain nombre de paires clé-valeur à l'intérieur fait undict
{'aaa', 'bbb', 'ccc'}
- un tuple de valeurs à l'intérieur fait unset
Donc:
{}
== zéro nombre de paires clé-valeur == videdict
{*()}
== 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:
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.la source
{()}
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érifiantlen({()})
qui sera 1 ou() in {()}
qui le seraTrue
.{()}
ne pas être un ensemble vide, au cas où quelqu'un d'autre ferait la même erreur. Merci, @ctrueden!Il existe plusieurs façons de créer un ensemble vide en Python:
Il s'agit de la méthode intégrée en python qui crée un ensemble vide dans cette variable.
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.
la source