Conjunto vazio literal?


461

[] = vazio list

() = vazio tuple

{} = vazio dict

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


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().


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.


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


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

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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.