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().
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)
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 setif a==set():#do something#length-checking comparisonif len(a)==0:#do something
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.
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ą.
{()}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:
Korzystanie z metody set ()
Jest to wbudowana metoda w Pythonie, która tworzy Pusty zestaw w tej zmiennej.
Używanie () metoda wyraźny (Creative Engineer Technika lol)
Zobacz poniższy przykład:
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.{0}-{0}
. Nie jest tak jasneset()
, ale ma tę zaletę, że wygląda jak zabawna para oczu.{}
jest słownikiem.{0}
jest zestawem.{0} - {0}
jest różnicą między zestawem a samym sobą, który jest pustym zestawem.Odpowiedzi:
Nie, nie ma dosłownej składni pustego zestawu. Musisz pisać
set()
.źródło
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:jest to w zasadzie bardziej skondensowany sposób
{_ for _ in ()}
, ale nie rób tego.źródło
$ 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()
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.Aby rozszerzyć przyjętą odpowiedź:
Z wersji
2.7
i3.1
python maset
dosł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)
Python 3.x
Więcej tutaj: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes
źródło
{}.__class__
nadal dawałbydict
{}.__class__
zwraca<class 'dict'>'
z pyt3.6, nie<type 'dict'>
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żyjset()
lub sprawdź, czy długość wynosi 0.przykład:
źródło
a=set()
nie opróżnia zestawu , ale tworzy nowy zestaw i przypisuje goa
, zastępując dowolną poprzednią wartość.a.clear()
metoda jest nieco szybsza niża=set()
, a sprawdzanielen(a)==0
jest nieco szybsze niż sprawdzanie równościa==set()
if len(a)==0:
tego wystarczy (i jest bardziej Pythonic) napisać po prostuif a:
(edytuj: a raczej,if not a:
aby dopasować biegunowość warunku).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.źródło
set
obiekty można modyfikować, więc narażasz się na ryzykospam = ϕ; spam.add("eggs")
.ϕ
jest zamrożonym zestawem, tospam.add("eggs")
kończy się niepowodzeniem, ponieważ zamrożony obiekt nie ma żadnejadd
metody.span = ϕ
obaspan
iϕ
wskaże ten sam obiekt, tjid(span) == id(ϕ)
. Stąd, jeślispam.add("eggs")
zadziałałoby,ϕ
obiekt nie byłby już pustym zestawem i wrócimy do pierwotnego problemu wskazanego przez drdaemana>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
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
dict
iset
literałami:{1: 'a', 2: 'b', 3: 'c'}
- kilka par klucz-wartość w środku tworzydict
{'aaa', 'bbb', 'ccc'}
- krotność wartości w środku tworzyset
Więc:
{}
== zerowa liczba par klucz-wartość == pustadict
{*()}
== 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:
NB : Jak zauważył ctrueden w komentarzach, nie
{()}
jest to pusty zestaw. Jest to zestaw z 1 elementem: pustą krotką.źródło
{()}
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ędzieTrue
.{()}
nie byciu pustym zestawem, na wypadek, gdyby ktoś popełnił ten sam błąd. Dziękuję, @ctrueden!Istnieje kilka sposobów tworzenia pustego zestawu w Pythonie:
Jest to wbudowana metoda w Pythonie, która tworzy Pusty zestaw w tej zmiennej.
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.
źródło