Gunakan tanda kurung kurawal untuk menginisialisasi Set dengan Python

98

Saya belajar python, dan saya punya pertanyaan pemula tentang menginisialisasi set. Melalui pengujian, saya telah menemukan bahwa satu set dapat diinisialisasi seperti ini:

my_set = {'foo', 'bar', 'baz'}

Apakah ada kerugian melakukannya dengan cara ini, yang bertentangan dengan cara standar:

my_set = set(['foo', 'bar', 'baz'])

atau hanya soal gaya?

fvrghl.dll
sumber
2
Dokumentasi menyebutkannya, hanya saja tidak ada. Perhatikan bahwa itu dokumentasi untuk modul usang, yang nyata set sekarang builtin. Ada di dokumen "Yang Baru di Python 2.7", dan referensi bahasa menjelaskannya secara singkat: docs.python.org/2/reference/expressions.html#set-displays
@delnan Saya menggunakan python 2.7, jadi saya tidak berpikir untuk mencari di dokumen python 3. Tautan yang saya posting adalah untuk 2.7, tetapi anehnya tidak menyebutkan ini.
fvrghl
1
Saya sejak mengedit komentar saya, 2.7 dokumen juga menyebutkan ini. Link yang Anda posting sudah usang, peninggalan masa lalu, salah, tidak berlaku lagi. Lupakan bahwa itu ada dan gunakan apa yang diperintahkan untuk Anda gunakan sebagai gantinya: docs.python.org/2/library/stdtypes.html#set dan docs.python.org/2/library/stdtypes.html#frozenset
@delnan Terima kasih telah membantu saya. Saya mengedit pertanyaan tersebut sehingga saya tidak lagi mengatakan bahwa tidak ada dokumentasi untuk itu (walaupun ada beberapa contoh yang menyebutkan ini secara online).
fvrghl
Untuk orang yang lewat: Pycharm memperingatkan agar tidak menggunakan panggilan fungsi ketika seseorang dapat menggunakan literal - mungkin ada alasan kinerja - jadi lebih suka cara literal yang ditetapkan dalam kode baru
Mr_and_Mrs_D

Jawaban:

102

Ada dua masalah yang jelas dengan sintaks literal yang ditetapkan:

my_set = {'foo', 'bar', 'baz'}
  1. Ini tidak tersedia sebelum Python 2.7

  2. Tidak ada cara untuk mengekspresikan himpunan kosong menggunakan sintaks itu (menggunakan {}membuat dict kosong)

Itu mungkin penting atau tidak penting bagi Anda.

Bagian dari dokumen yang menguraikan sintaks ini ada di sini .

bgporter
sumber
46

Bandingkan juga perbedaan antara {}dan set()dengan argumen satu kata.

>>> a = set('aardvark')
>>> a
{'d', 'v', 'a', 'r', 'k'} 
>>> b = {'aardvark'}
>>> b
{'aardvark'}

tapi keduanya adan btentu saja adalah set.

Thruston
sumber
4
itulah mengapa saya lebih suka mengingatkan diri saya sendiri tentang set konstruktor set([])daripada hanya set().
Michael Ekoka
3
set()selalu mengambil satu argumen. Satu iterable.
George Kettleborough
1
@GeorgeKettleborough satu atau tanpa argumen, yang terakhir untuk membuat satu set kosong.
gertvdijk
28

Dari dokumentasi Python 3 ( berlaku sama untuk python 2.7 ):

Tanda kurung kurawal atau fungsi set () bisa digunakan untuk membuat set. Catatan: untuk membuat set kosong Anda harus menggunakan set (), bukan {}; yang terakhir membuat kamus kosong, struktur data yang kita bahas di bagian selanjutnya.

dengan python 2.7:

>>> my_set = {'foo', 'bar', 'baz', 'baz', 'foo'}
>>> my_set
set(['bar', 'foo', 'baz'])

Ketahuilah bahwa {}itu juga digunakan untuk map/ dict:

>>> m = {'a':2,3:'d'}
>>> m[3]
'd'
>>> m={}
>>> type(m)
<type 'dict'> 

Anda juga dapat menggunakan sintaks komprehensif untuk menginisialisasi set:

>>> a = {x for x in """didn't know about {} and sets """ if x not in 'set' }
>>> a
set(['a', ' ', 'b', 'd', "'", 'i', 'k', 'o', 'n', 'u', 'w', '{', '}'])
0x90
sumber
1

Yang perlu Anda lakukan empty_set = set()untuk menginisialisasi set kosong. {}adalah diksi kosong.

Arjjun
sumber