Menggunakan PyCharm, saya perhatikan itu menawarkan untuk mengkonversi literal dict :
d = {
'one': '1',
'two': '2',
}
menjadi konstruktor dict :
d = dict(one='1', two='2')
Apakah pendekatan yang berbeda ini berbeda secara signifikan?
(Saat menulis pertanyaan ini saya perhatikan bahwa menggunakannya dict()
tampaknya tidak mungkin untuk menentukan kunci numerik .. d = {1: 'one', 2: 'two'}
adalah mungkin, tetapi, jelas, dict(1='one' ...)
tidak. Ada yang lain?)
python
dictionary
pycharm
maligree
sumber
sumber
dict()
mengambil daftar pasangan nilai kunci serta memungkinkan parameter bernama, sehingga dapat digunakan untuk membuat semua jenis dict, hanya saja tidak dengan sintaks yang Anda gunakan. Mungkin juga tidak ada artinya sama sekali jika ada bug ( youtrack.jetbrains.net/issue/PY-2512 ) di pyCharm secara khusus karena apa yang Anda temukan, yang telah diperbaiki).dict(abc = 123)
konstruktor menghasilkan kamus dengan kunci byte-string'abc'
, yang mungkin mengejutkan jika Anda menggunakanunicode_literals
dan mengharapkan kunci kamus menjadi unicodeu'abc'
. Lihat stackoverflow.com/questions/20357210/… .Jawaban:
Saya pikir Anda telah menunjukkan perbedaan yang paling jelas. Selain itu,
yang pertama tidak perlu pencarian
dict
yang seharusnya membuatnya sedikit lebih cepatterlihat kedua sampai
dict
dilocals()
kemudianglobals()
dan penemuan builtin, sehingga Anda dapat beralih perilaku dengan mendefinisikan lokal yang disebutdict
misalnya meskipun saya tidak bisa memikirkan di mana ini akan menjadi ide yang baik selain mungkin ketika debuggingsumber
Literal jauh lebih cepat, karena menggunakan opcode BUILD_MAP dan STORE_MAP yang dioptimalkan daripada CALL_FUNCTION umum:
sumber
Mereka terlihat hampir sama di Python 3.2.
Seperti yang ditunjukkan oleh gnibbler, yang pertama tidak perlu pencarian
dict
, yang seharusnya membuatnya sedikit lebih cepat.sumber
$ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' "{'a': 1, 'b': 2, 'c': 3}" ....... Mean +- std dev: 1.73 ns +- 0.14 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' '{k:v for k,v in i}' ....... Mean +- std dev: 139 ns +- 10 ns $ pypy -m perf timeit -l '1000000' -n '5' -s 'i=(("a",1), ("b", 2), ("c", 3))' 'dict(i)' ....... Mean +- std dev: 188 ns +- 16 ns
Kedua pendekatan ini menghasilkan kamus yang identik, kecuali, seperti yang telah Anda catat, di mana aturan leksikal Python mengganggu.
Kamus kamus sedikit lebih jelas kamus, dan Anda dapat membuat segala jenis kunci, tetapi Anda perlu mengutip nama-nama kunci. Di sisi lain, Anda dapat menggunakan variabel untuk kunci jika Anda perlu untuk beberapa alasan:
The
dict()
konstruktor memberi Anda lebih banyak fleksibilitas karena berbagai bentuk masukan yang dibutuhkan. Misalnya, Anda bisa memberikan iterator berpasangan, dan itu akan memperlakukan mereka sebagai pasangan kunci / nilai.Saya tidak tahu mengapa PyCharm akan menawarkan untuk mengkonversi satu bentuk ke bentuk lainnya.
sumber
Satu perbedaan besar dengan python 3.4 + pycharm adalah konstruktor dict () menghasilkan pesan "syntax error" jika jumlah kunci melebihi 256.
Saya lebih suka menggunakan dict literal sekarang.
sumber
Dari tutorial python 2.7:
Sementara:
Jadi {} dan dict () menghasilkan kamus tetapi menyediakan cara inisialisasi data kamus yang sedikit berbeda.
sumber
Saya menemukan dict literal
d = {'one': '1'}
menjadi lebih mudah dibaca, mendefinisikan data Anda, daripada menetapkan nilai hal-hal dan mengirimkannya kedict()
konstruktor.Di sisi lain saya telah melihat orang salah ketik dict literal
d = {'one', '1'}
yang dalam python modern 2.7+ akan membuat satu set.Meskipun demikian saya masih lebih suka untuk semua cara menggunakan himpunan literal karena saya pikir itu lebih mudah dibaca, preferensi pribadi saya kira.
sumber
set
s ada. Saya berharap ada sintaks literal untuk perintah dicts ... cukup yakin saya menggunakannya lebih sering daripada set.dict () literal bagus ketika Anda menyalin nilai paste dari sesuatu yang lain (tidak ada python) Sebagai contoh daftar variabel lingkungan. jika Anda memiliki file bash, katakan
Anda dapat dengan mudah menempelkan ke
dict()
literal dan menambahkan komentar. Ini juga membuatnya lebih mudah untuk melakukan yang sebaliknya, menyalin ke sesuatu yang lain. Padahal{'FOO': 'bar'}
sintaksisnya cukup unik untuk python dan json. Jadi jika Anda banyak menggunakan json, Anda mungkin ingin menggunakan{}
literal dengan tanda kutip ganda.sumber
Tidak ada dict literal untuk membuat kelas dict diwarisi, kelas dict khusus dengan metode tambahan. Dalam kasus seperti itu konstruktor kelas dikt kustom harus digunakan, misalnya:
sumber
Juga pertimbangkan fakta bahwa token yang cocok dengan operator tidak dapat digunakan dalam sintaks konstruktor, yaitu kunci dasherized.
sumber