Kosongkan himpunan literal?

461

[] = kosong list

() = kosong tuple

{} = kosong dict

Apakah ada notasi serupa untuk yang kosong set? Atau saya harus menulis set()?

Johan Råde
sumber
12
Anda tidak menerima {i for i in []}, bukan?
utdemir
3
Hanya ingin menunjukkan hampir semua hal yang mungkin dengan python. Jika Anda ingin membuat set tanpa menggunakan to set (), Anda bisa.
utdemir
6
Ya, Anda dapat melakukan hampir semua hal dalam ratusan cara yang terpadu. Saya tidak menambahkan map(lambda x: x)contoh kode saya hanya untuk menunjukkan itu berfungsi baik. Ini bukan himpunan harfiah juga, itu hanya pemahaman himpunan.
130
Cara bodoh yang berhasil adalah {0}-{0}. Ini tidak sejelas itu set(), tetapi memang memiliki keuntungan terlihat seperti sepasang mata yang lucu.
wim
10
@Chris {}adalah kamus. {0}adalah satu set. {0} - {0}adalah perbedaan antara set dan dirinya sendiri, yang merupakan set kosong.
michaelsnowden

Jawaban:

519

Tidak, tidak ada sintaks literal untuk set kosong. Anda harus menulis set().

sepp2k
sumber
Maksud Anda tidak ada sintaks literal untuk set kosong? Atau untuk set secara umum?
Johan Råde
15
Ada himpunan literal, tetapi hanya dalam Python 3.x. Tidak ada literal untuk set kosong.
2
@ user763305: Manual bahasa cukup jelas tentang hal ini. docs.python.org/library/stdtypes.html#set-types-set-frozenset mengatakan "set non-kosong ... dapat dibuat dengan menempatkan daftar elemen yang dipisahkan koma dalam kurung kurawal"
S.Lott
44
Sebenarnya, himpunan literal telah di-backport ke Python 2.7, sehingga tidak hanya tersedia secara ketat dalam Python 3.
Jim Brissom
13
@ Beruntung Itu bukan set kosong - itu set yang berisi angka 1. Anda tidak perlu koma tertinggal - itu hanya diperlukan untuk tupel.
sepp2k
54

Dengan segala cara, silakan gunakan set() untuk membuat set kosong.

Tetapi, jika Anda ingin membuat orang terkesan, katakan kepada mereka bahwa Anda dapat membuat set kosong menggunakan literal dan *dengan Python> = 3.5 ( lihat PEP 448 ) dengan melakukan:

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

ini pada dasarnya adalah cara yang lebih padat untuk melakukannya {_ for _ in ()}, tetapi, jangan lakukan ini.

Dimitris Fasarakis Hilliard
sumber
Mengapa?! Performa hampir identik:$ 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
oguret
9
@ogurets, set()kemungkinan jauh lebih mudah dipahami (untuk pengelola kode), dan itu seringkali lebih penting daripada kinerja. {*()}tampaknya "pintar" dalam arti yang hampir merendahkan.
benjimin
Heh, itu pintar.
Kowalski
46

Hanya untuk memperluas jawaban yang diterima:

Dari versi 2.7dan 3.1python telah mendapat setliteral {}dalam bentuk penggunaan {1,2,3}, tetapi {}itu sendiri masih digunakan untuk dict kosong.

Python 2.7 (baris pertama tidak valid dalam Python <2.7)

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

Python 3.x

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

Lebih lanjut di sini: https://docs.python.org/3/whatsnew/2.7.html#other-language-changes

Reishin
sumber
12
Jawaban ini salah. Masih belum ada sintaks literal untuk mewakili set kosong. {}.__class__akan tetap memberidict
Ninja420
8
@ Ninja420 coba baca dulu sebelum berkomentar, saya perhatikan
Reishin
3
Jawaban yang diterima masih benar, dan tidak ketinggalan zaman. Tidak ada sintaks literal untuk set kosong , namun ada satu untuk kamus kosong.
AndreasHassing
2
@ AndreasBjørn untuk ya kosong, namun untuk non kosong Anda akan mendapatkan pengecualian dan saran PEP8 untuk menggunakan himpunan literal.
Reishin
sebenarnya, {}.__class__kembali <class 'dict'>'dengan pyt3.6, tidak<type 'dict'>
wah
6

Itu tergantung pada apakah Anda ingin literal untuk perbandingan, atau untuk tugas.

Jika Anda ingin membuat set yang ada kosong, Anda dapat menggunakan .clear()metodenya, terutama jika Anda ingin menghindari membuat objek baru. Jika Anda ingin melakukan perbandingan, gunakan set()atau periksa apakah panjangnya 0.

contoh:

#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
sumber
8
a=set()tidak mengosongkan set , tetapi membuat set baru dan menugaskannya a, menimpa nilai sebelumnya.
gerrit
Memang. Itu sebabnya saya mengatakan bahwa jika Anda ingin menghindari membuat objek baru, Anda harus menggunakan clear (). Saya kira komentar saya seharusnya sedikit berbeda.
Brian Minton
Tampaknya juga menggunakan a.clear()metode ini sedikit lebih cepat daripada a=set(), dan memeriksa len(a)==0sedikit lebih cepat daripada memeriksa kesetaraan untuka==set()
Brian Minton
3
Alih-alih if len(a)==0:itu sudah cukup (dan lebih Pythonic) untuk menulis adil if a: (sunting: atau lebih tepatnya, if not a:untuk mencocokkan polaritas kondisi).
Jim Oldfield
2

Menambahkan ke ide-ide gila: dengan Python 3 menerima pengidentifikasi unicode, Anda bisa mendeklarasikan variabel ϕ = frozenset()(ϕ adalah U + 03D5) dan menggunakannya.

Renato Garcia
sumber
4
Masalahnya adalah, setobjek bisa berubah, jadi Anda menempatkan diri Anda dalam risiko spam = ϕ; spam.add("eggs").
drdaeman
3
jika ϕadalah frozenset, maka spam.add("eggs")gagal, karena objek frozenset tidak memiliki addmetode apa pun .
Brian Minton
1
@BrianMinton: Tapi itu perilaku yang dimaksud. Perhatikan bahwa ketika seseorang menulis span = ϕkeduanya spandan ϕakan menunjuk ke objek yang sama, yaitu id(span) == id(ϕ). Oleh karena itu, jika spam.add("eggs")berhasil, ϕobjek tidak akan menjadi set kosong lagi, dan kita akan kembali ke masalah semula seperti yang ditunjukkan oleh drdaeman
Renato Garcia
1
@RenatoGarcia Bandingkan dengan dict literal kosong:>>> a={} >>> a['foo']='bar' >>> a {'foo': 'bar'}
Brian Minton
1

Iya. Notasi yang sama yang berfungsi untuk dict / set yang tidak kosong berfungsi untuk yang kosong.

Perhatikan perbedaan antara non-kosong dictdan setliteral:

{1: 'a', 2: 'b', 3: 'c'}- sejumlah pasangan kunci-nilai di dalam membuat dict
{'aaa', 'bbb', 'ccc'}- a tupel nilai di dalam membuat aset

Begitu:

{}== jumlah pasangan kunci-nilai nol == kosong dict
{*()}== jumlah nilai kosong == kosongset

Namun faktanya, bahwa Anda dapat melakukannya, tidak berarti Anda harus melakukannya. Kecuali Anda memiliki alasan kuat, lebih baik membuat set kosong secara eksplisit, seperti:

a = set()

NB : Seperti ctrueden melihat dalam komentar, {()}adalah bukan himpunan kosong. Ini satu set dengan 1 elemen: tuple kosong.

pycoder
sumber
2
{()}bukan set kosong. Ini adalah satu set tunggal dengan satu elemen: sebuah tuple kosong. Anda dapat memverifikasi ini dengan memeriksa len({()})yang mana akan menjadi 1, atau () in {()}, yang akan menjadi True.
ctrueden
1
Ups, Anda benar! Saya memperbarui posting: menambahkan catatan tentang {()}tidak menjadi set kosong, kalau-kalau ada orang yang membuat kesalahan yang sama. Terima kasih, @ctrueden!
pycoder
-1

Ada beberapa cara untuk membuat Set kosong di Python:

  1. Menggunakan metode set ()
    Ini adalah metode bawaan di python yang menciptakan set Kosong di variabel itu.
  2. Menggunakan metode clear () (Teknik Insinyur kreatif LOL)
    Lihat Contoh ini:

    sets = {"Hai", "How", "is", "You", "All"}
    jenis (set) (Output Baris ini: set)
    set .clear ()
    print (set) (Output Baris Ini: {})
    jenis (set) (Output Baris Ini: set)

Jadi, Ini adalah 2 cara untuk membuat Set kosong.

Temui Shah
sumber