Só quero mostrar que quase tudo é possível com o python. Se você deseja criar um conjunto sem usar set (), é possível.
Utdemir
6
Sim, você pode fazer praticamente tudo de cem maneiras convictas. Eu não adiciono map(lambda x: x)aos meus exemplos de código apenas para mostrar que também funciona. Também não é um conjunto literal, é apenas uma compreensão do conjunto.
130
Uma maneira idiota que funciona seria {0}-{0}. Não é tão claro quanto set(), mas tem a vantagem de parecer um par de olhos engraçados.
Wim
10
@ Chris {}é um dicionário. {0}é um conjunto. {0} - {0}é a diferença entre um conjunto e ele próprio, que é o conjunto vazio.
michaelsnowden
Respostas:
519
Não, não há sintaxe literal para o conjunto vazio. Você tem que escrever set().
Você quer dizer que não há sintaxe literal para o conjunto vazio? Ou para conjuntos em geral?
Johan Råde 25/05
15
Existem literais definidos, mas apenas no Python 3.x. Não existe um literal para conjuntos vazios de qualquer maneira.
2
@ user763305: O manual do idioma é bastante claro neste ponto. docs.python.org/library/stdtypes.html#set-types-set-frozenset diz que "conjuntos não vazios ... podem ser criados colocando uma lista de elementos separados por vírgula entre chaves"
S.Lott
44
Na verdade, literais estabelecidos foram portadas para Python 2.7, para que eles não só estão disponíveis estritamente em Python 3.
Jim Brissom
13
@andy Esse não é um conjunto vazio - é um conjunto que contém o número 1. Você não precisa da vírgula à direita - só é necessário para as tuplas.
sepp2k
54
Por todos os meios, useset() para criar um conjunto vazio.
Mas, se você quiser impressionar as pessoas, diga a elas que você pode criar um conjunto vazio usando literais e *com Python> = 3.5 ( consulte PEP 448 ) fazendo:
>>> s ={*()}# or {*{}} or {*[]}>>>print(s)
set()
essa é basicamente uma maneira mais condensada de fazer {_ for _ in ()}, mas não faça isso.
Por quê?! O desempenho é quase idêntico:$ 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 31/03/19
9
@ogurets, set()é provavelmente muito mais fácil de entender (para mantenedores de código), e isso geralmente importa mais do que desempenho. {*()}parece "inteligente" em um sentido quase pejorativo.
benjimin 7/06/19
Heh, isso é inteligente.
Kowalski
46
Apenas para estender a resposta aceita:
De versão 2.7e 3.1python tem setliteral {}em forma de uso {1,2,3}, mas {}ainda é usado para dict vazio.
Python 2.7 (a primeira linha é inválida no Python <2.7)
Esta resposta está errada. Ainda não há sintaxe literal para representar um conjunto vazio. {}.__class__seria ainda dardict
Ninja420
8
@ Ninja420 tente ler antes de comentário, tenho notado que
Reishin
3
A resposta aceita ainda está correta e não está desatualizada. Não existe uma sintaxe literal para o conjunto vazio ; no entanto, existe uma para o dicionário vazio.
precisa
2
@ AndreasBjørn para um vazio sim, no entanto para não vazio você receberá a exceção e sugestão do PEP8 para usar o conjunto literal.
Reishin
na verdade, {}.__class__retorna <class 'dict'>'com pyt3.6, não<type 'dict'>
klew
6
Depende se você deseja o literal para uma comparação ou para atribuição.
Se você deseja tornar um conjunto existente vazio, pode usar o .clear()método, especialmente se desejar evitar a criação de um novo objeto. Se você quiser fazer uma comparação, use set()ou verifique se o comprimento é 0.
exemplo:
#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()não esvazia o conjunto , mas cria um novo conjunto e o atribui a, substituindo qualquer valor anterior.
Gerrit
De fato. Por isso eu disse que, se você deseja evitar a criação de um novo objeto, deve usar clear (). Suponho que meu comentário deveria ter sido redigido de maneira um pouco diferente.
Brian Minton
Parece também usando o a.clear()método é ligeiramente mais rápido do que a=set(), e verificação len(a)==0é ligeiramente mais rápido do que a verificação de igualdade paraa==set()
Brian Minton
3
Em vez disso if len(a)==0:, basta (e é mais pitonico) escrever apenas if a: (editar: ou melhor, if not a:corresponder à polaridade da condição).
Jim Oldfield
2
Adicionando idéias malucas: com o Python 3 aceitando identificadores unicode, você pode declarar uma variável ϕ = frozenset()(ϕ é U + 03D5) e usá-la.
O problema é que os setobjetos são mutáveis, então você está se colocando em risco spam = ϕ; spam.add("eggs").
drdaeman
3
se ϕfor um frozenset, spam.add("eggs")falhará, porque o objeto frozenset não possui nenhum addmétodo.
Brian Minton
1
@BrianMinton: Mas esse é o comportamento pretendido. Note que quando alguém escreve os span = ϕdois spane ϕaponta para o mesmo objeto, ie id(span) == id(ϕ). Portanto, se spam.add("eggs")iria funcionar, o ϕobjeto não seria um conjunto vazio mais, e vamos voltar para o problema original como apontado por drdaeman
Renato Garcia
1
@RenatoGarcia Compare com o literal de ditado vazio:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton
1
Sim. A mesma notação que funciona para dict / set não vazio funciona para os vazios.
Observe a diferença entre não vazio dicteset literais :
{1: 'a', 2: 'b', 3: 'c'}- um número de pares de valores-chave dentro faz um dict {'aaa', 'bbb', 'ccc'}- uma tupla de valores dentro faz umset
Assim:
{}== número zero de pares de valores-chave == vazio dict {*()}== tupla de valores vazia == vazioset
No entanto, o fato de você poder fazer isso não significa que você deva. A menos que você tenha razões fortes, é melhor construir explicitamente um conjunto vazio, como:
a = set()
NB : Como ctrueden notou nos comentários, não{()} é um conjunto vazio. É um conjunto com 1 elemento: tupla vazia.
{()}não é o conjunto vazio. É um conjunto único com um elemento: uma tupla vazia. Você pode verificar isso verificando len({()})qual será 1 ou () in {()}qual será True.
precisa saber é o seguinte
1
Opa, você está certo! Atualizei o post: adicionei a observação de {()}não ser um conjunto vazio, caso outra pessoa cometa o mesmo erro. Obrigado, @ctrueden!
Pycoder
-1
Existem algumas maneiras de criar um conjunto vazio no Python:
Usando o método set ()
Este é o método interno em python que cria o conjunto Vazio nessa variável.
Usando o método clear () (técnica criativa do engenheiro LOL)
Veja este exemplo:
sets = {"Hi", "How", "are", "You", "All"}
tipo (sets) (saída desta linha: set)
sets .clear ()
print (sets) (saída desta linha: {})
tipo (sets) (saída desta linha: set)
Portanto, estas são duas maneiras de criar um conjunto vazio.
map(lambda x: x)
aos meus exemplos de código apenas para mostrar que também funciona. Também não é um conjunto literal, é apenas uma compreensão do conjunto.{0}-{0}
. Não é tão claro quantoset()
, mas tem a vantagem de parecer um par de olhos engraçados.{}
é um dicionário.{0}
é um conjunto.{0} - {0}
é a diferença entre um conjunto e ele próprio, que é o conjunto vazio.Respostas:
Não, não há sintaxe literal para o conjunto vazio. Você tem que escrever
set()
.fonte
Por todos os meios, use
set()
para criar um conjunto vazio.Mas, se você quiser impressionar as pessoas, diga a elas que você pode criar um conjunto vazio usando literais e
*
com Python> = 3.5 ( consulte PEP 448 ) fazendo:essa é basicamente uma maneira mais condensada de fazer
{_ for _ in ()}
, mas não faça isso.fonte
$ 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()
é provavelmente muito mais fácil de entender (para mantenedores de código), e isso geralmente importa mais do que desempenho.{*()}
parece "inteligente" em um sentido quase pejorativo.Apenas para estender a resposta aceita:
De versão
2.7
e3.1
python temset
literal{}
em forma de uso{1,2,3}
, mas{}
ainda é usado para dict vazio.Python 2.7 (a primeira linha é inválida no Python <2.7)
Python 3.x
Mais aqui: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
fonte
{}.__class__
seria ainda dardict
{}.__class__
retorna<class 'dict'>'
com pyt3.6, não<type 'dict'>
Depende se você deseja o literal para uma comparação ou para atribuição.
Se você deseja tornar um conjunto existente vazio, pode usar o
.clear()
método, especialmente se desejar evitar a criação de um novo objeto. Se você quiser fazer uma comparação, useset()
ou verifique se o comprimento é 0.exemplo:
fonte
a=set()
não esvazia o conjunto , mas cria um novo conjunto e o atribuia
, substituindo qualquer valor anterior.a.clear()
método é ligeiramente mais rápido do quea=set()
, e verificaçãolen(a)==0
é ligeiramente mais rápido do que a verificação de igualdade paraa==set()
if len(a)==0:
, basta (e é mais pitonico) escrever apenasif a:
(editar: ou melhor,if not a:
corresponder à polaridade da condição).Adicionando idéias malucas: com o Python 3 aceitando identificadores unicode, você pode declarar uma variável
ϕ = frozenset()
(ϕ é U + 03D5) e usá-la.fonte
set
objetos são mutáveis, então você está se colocando em riscospam = ϕ; spam.add("eggs")
.ϕ
for um frozenset,spam.add("eggs")
falhará, porque o objeto frozenset não possui nenhumadd
método.span = ϕ
doisspan
eϕ
aponta para o mesmo objeto, ieid(span) == id(ϕ)
. Portanto, sespam.add("eggs")
iria funcionar, oϕ
objeto não seria um conjunto vazio mais, e vamos voltar para o problema original como apontado por drdaeman>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Sim. A mesma notação que funciona para dict / set não vazio funciona para os vazios.
Observe a diferença entre não vazio
dict
eset
literais :{1: 'a', 2: 'b', 3: 'c'}
- um número de pares de valores-chave dentro faz umdict
{'aaa', 'bbb', 'ccc'}
- uma tupla de valores dentro faz umset
Assim:
{}
== número zero de pares de valores-chave == vaziodict
{*()}
== tupla de valores vazia == vazioset
No entanto, o fato de você poder fazer isso não significa que você deva. A menos que você tenha razões fortes, é melhor construir explicitamente um conjunto vazio, como:
NB : Como ctrueden notou nos comentários, não
{()}
é um conjunto vazio. É um conjunto com 1 elemento: tupla vazia.fonte
{()}
não é o conjunto vazio. É um conjunto único com um elemento: uma tupla vazia. Você pode verificar isso verificandolen({()})
qual será 1 ou() in {()}
qual seráTrue
.{()}
não ser um conjunto vazio, caso outra pessoa cometa o mesmo erro. Obrigado, @ctrueden!Existem algumas maneiras de criar um conjunto vazio no Python:
Este é o método interno em python que cria o conjunto Vazio nessa variável.
Veja este exemplo:
sets = {"Hi", "How", "are", "You", "All"}
tipo (sets) (saída desta linha: set)
sets .clear ()
print (sets) (saída desta linha: {})
tipo (sets) (saída desta linha: set)
Portanto, estas são duas maneiras de criar um conjunto vazio.
fonte