Pusty zestaw dosłowny?


460

[] = pusty list

() = pusty tuple

{} = pusty dict

Czy istnieje podobny zapis dla pustego set? Czy muszę pisać set()?


12
nie akceptujesz {i for i in []}, prawda?
utdemir

3
Chcę tylko pokazać prawie wszystko, co jest możliwe dzięki pythonowi. Jeśli chcesz utworzyć zestaw bez użycia set (), możesz.
utdemir

6
Tak, możesz zrobić prawie wszystko na sto przekonanych sposobów. Nie dodam map(lambda x: x)do moich przykładów kodu, żeby pokazać, że to działa. To nie jest też kompletny literał, to tylko kompletne zrozumienie.

130
Byłby głupi sposób, który zadziała {0}-{0}. Nie jest tak jasne set(), ale ma tę zaletę, że wygląda jak zabawna para oczu.
wim

10
@Chris {}jest słownikiem. {0}jest zestawem. {0} - {0}jest różnicą między zestawem a samym sobą, który jest pustym zestawem.
michaelsnowden

Odpowiedzi:


520

Nie, nie ma dosłownej składni pustego zestawu. Musisz pisać set().


Masz na myśli, że nie ma dosłownej składni pustego zestawu? Lub ogólnie dla zestawów?
Johan Råde

15
Są ustawione literały, ale tylko w Pythonie 3.x. Tak czy inaczej, nie ma literału na puste zestawy.

2
@ user763305: Podręcznik językowy jest dość jasny w tej kwestii. docs.python.org/library/stdtypes.html#set-types-set-frozenset mówi „niepuste zestawy ... można utworzyć, umieszczając listę nawiasów
przecinających

43
W rzeczywistości ustawione literały zostały przeniesione z powrotem do Pythona 2.7, więc są one dostępne nie tylko w Pythonie 3.
Jim Brissom

13
@andy To nie jest pusty zestaw - to jest zestaw zawierający liczbę 1. Nawiasem mówiąc, nie potrzebujesz przecinka końcowego - jest to wymagane tylko dla krotek.
sepp2k

53

Oczywiście, proszę użyć, set() aby utworzyć pusty zestaw.

Ale jeśli chcesz zaimponować ludziom, powiedz im, że możesz utworzyć pusty zestaw za pomocą literałów i *przy użyciu Pythona> = 3.5 ( patrz PEP 448 ), wykonując:

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

jest to w zasadzie bardziej skondensowany sposób {_ for _ in ()}, ale nie rób tego.


Dlaczego?! Wydajność jest prawie identyczna:$ 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()jest prawdopodobnie znacznie łatwiejszy do zrozumienia (dla opiekunów kodu), a to często ma większe znaczenie niż wydajność. {*()}wydaje się „sprytny” w niemal pejoratywnym sensie.
benjimin

Heh, to sprytne.
Kowalski

46

Aby rozszerzyć przyjętą odpowiedź:

Z wersji 2.7i 3.1python ma setdosłowne {}zastosowanie {1,2,3}, ale {}samo w sobie jest używane do pustego dykta.

Python 2.7 (pierwszy wiersz jest nieprawidłowy w Pythonie <2.7)

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

Python 3.x

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

Więcej tutaj: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes


12
Ta odpowiedź jest zła. Nadal nie ma dosłownej składni reprezentującej pusty zestaw. {}.__class__nadal dawałbydict
Ninja420

8
@ Ninja420 spróbuj przeczytać najpierw przed komentarzem, zauważyłem, że
Reishin

3
Przyjęta odpowiedź jest nadal poprawna i nie jest przestarzała. Nie ma dosłownej składni dla pustego zestawu , istnieje jednak jedna dla pustego słownika.
AndreasHassing

2
@ AndreasBjørn dla pustego tak, jednak dla niepustego dostaniesz wyjątek PEP8 i sugestię użycia zestawu literału.
Reishin,

w rzeczywistości {}.__class__zwraca <class 'dict'>'z pyt3.6, nie<type 'dict'>
klew

6

To zależy, czy chcesz literału do porównania, czy do przypisania.

Jeśli chcesz, aby istniejący zestaw był pusty, możesz użyć tej metody .clear(), zwłaszcza jeśli chcesz uniknąć tworzenia nowego obiektu. Jeśli chcesz dokonać porównania, użyj set()lub sprawdź, czy długość wynosi 0.

przykład:

#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()nie opróżnia zestawu , ale tworzy nowy zestaw i przypisuje go a, zastępując dowolną poprzednią wartość.
gerrit

W rzeczy samej. Dlatego powiedziałem, że jeśli chcesz uniknąć tworzenia nowego obiektu, powinieneś użyć clear (). Przypuszczam, że mój komentarz powinien być sformułowany nieco inaczej.
Brian Minton

Wydaje się również, że a.clear()metoda jest nieco szybsza niż a=set(), a sprawdzanie len(a)==0jest nieco szybsze niż sprawdzanie równościa==set()
Brian Minton

3
Zamiast if len(a)==0:tego wystarczy (i jest bardziej Pythonic) napisać po prostu if a: (edytuj: a raczej, if not a:aby dopasować biegunowość warunku).
Jim Oldfield,

2

Dodając do zwariowanych pomysłów: mając Python 3 akceptujący identyfikatory Unicode, możesz zadeklarować zmienną ϕ = frozenset()(ϕ to U + 03D5) i użyć jej zamiast tego.


4
Problem w tym, że setobiekty można modyfikować, więc narażasz się na ryzyko spam = ϕ; spam.add("eggs").
drdaeman

3
jeśli ϕjest zamrożonym zestawem, to spam.add("eggs")kończy się niepowodzeniem, ponieważ zamrożony obiekt nie ma żadnej addmetody.
Brian Minton

1
@BrianMinton: Ale takie jest zamierzone zachowanie. Zauważ, że gdy ktoś napisze span = ϕoba spani ϕwskaże ten sam obiekt, tj id(span) == id(ϕ). Stąd, jeśli spam.add("eggs")zadziałałoby, ϕobiekt nie byłby już pustym zestawem i wrócimy do pierwotnego problemu wskazanego przez drdaemana
Renato Garcia

1
@RenatoGarcia Porównaj z dosłownym pustym dyktatorem:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton

1

Tak. Ta sama notacja, która działa dla niepustych dykt / zestawów, działa dla pustych.

Zwróć uwagę na różnicę między niepustymi dicti setliterałami:

{1: 'a', 2: 'b', 3: 'c'}- kilka par klucz-wartość w środku tworzy dict
{'aaa', 'bbb', 'ccc'}- krotność wartości w środku tworzyset

Więc:

{}== zerowa liczba par klucz-wartość == pusta dict
{*()}== pusta krotka wartości == pustaset

Jednak fakt, że możesz to zrobić, nie oznacza, że ​​powinieneś. O ile nie masz silnych powodów, lepiej zbudować pusty zestaw jawnie, na przykład:

a = set()

NB : Jak zauważył ctrueden w komentarzach, nie{()} jest to pusty zestaw. Jest to zestaw z 1 elementem: pustą krotką.


2
{()}nie jest pustym zestawem. Jest to singleton z jednym elementem: pustą krotką. Możesz to sprawdzić, sprawdzając, len({()})która będzie 1, lub () in {()}która będzie True.
ctrueden

1
Ups, masz rację! Zaktualizowałem post: dodałem notatkę o {()}nie byciu pustym zestawem, na wypadek, gdyby ktoś popełnił ten sam błąd. Dziękuję, @ctrueden!
pikoder

-1

Istnieje kilka sposobów tworzenia pustego zestawu w Pythonie:

  1. Korzystanie z metody set ()
    Jest to wbudowana metoda w Pythonie, która tworzy Pusty zestaw w tej zmiennej.
  2. Używanie () metoda wyraźny (Creative Engineer Technika lol)
    Zobacz poniższy przykład:

    zestawy = { "Cześć", "Jak", "to", "Ty", "All"}
    mostowe (zestawy) (To wyjście liniowe: zestaw)
    Zestawy .clear ()
    print (sets) (This Output Line: {})
    type (sets) (This Line Output: set)

Są to 2 sposoby na utworzenie pustego zestawu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.