Conjunto vazio literal?

461

[] = vazio list

() = vazio tuple

{} = vazio dict

Existe uma notação semelhante para um vazio set? Ou tenho que escrever set()?

Johan Råde
fonte
12
você não aceita {i for i in []}, não é?
Utdemir
3
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().

sepp2k
fonte
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, 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:

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

essa é basicamente uma maneira mais condensada de fazer {_ for _ in ()}, mas não faça isso.

Dimitris Fasarakis Hilliard
fonte
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)

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

Python 3.x

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

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

Reishin
fonte
12
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 set
if a==set():
    #do something

#length-checking comparison
if len(a)==0:
    #do something
Brian Minton
fonte
8
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.

Renato Garcia
fonte
4
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.

pycoder
fonte
2
{()}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:

  1. Usando o método set ()
    Este é o método interno em python que cria o conjunto Vazio nessa variável.
  2. 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.

Conheça Shah
fonte