Pusty zestaw dosłowny?

460

[] = pusty list

() = pusty tuple

{} = pusty dict

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

Johan Råde
źródło
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().

sepp2k
źródło
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.

Dimitris Fasarakis Hilliard
źródło
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

Reishin
źródło
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
Brian Minton
źródło
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.

Renato Garcia
źródło
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ą.

pikoder
źródło
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.

Poznaj Shah
źródło