Dalam Python 2.7 , saya bisa mendapatkan kunci kamus , nilai , atau item sebagai daftar:
>>> newdict = {1:0, 2:0, 3:0}
>>> newdict.keys()
[1, 2, 3]
Sekarang, dengan Python> = 3.3 , saya mendapatkan sesuatu seperti ini:
>>> newdict.keys()
dict_keys([1, 2, 3])
Jadi, saya harus melakukan ini untuk mendapatkan daftar:
newlist = list()
for i in newdict.keys():
newlist.append(i)
Saya bertanya-tanya, apakah ada cara yang lebih baik untuk mengembalikan daftar dengan Python 3 ?
python
python-3.x
list
dictionary
python-2.x
Dimitris Fasarakis Hilliard
sumber
sumber
Jawaban:
Coba
list(newdict.keys())
.Ini akan mengonversi
dict_keys
objek ke daftar.Di sisi lain, Anda harus bertanya pada diri sendiri apakah itu penting atau tidak. Cara Pythonic untuk kode adalah dengan mengasumsikan mengetik bebek ( jika terlihat seperti bebek dan dukun seperti bebek, itu bebek ). The
dict_keys
objek akan bertindak seperti daftar untuk sebagian besar tujuan. Contohnya:Jelas, operator penyisipan mungkin tidak berfungsi, tetapi itu tidak masuk akal untuk daftar kunci kamus.
sumber
list(newdict)
juga berfungsi (setidaknya dalam python 3.4). Apakah ada alasan untuk menggunakan.keys()
metode ini?pdb> list(newdict.keys())
gagal karena berbenturan dengan perintah pdb dengan nama yang sama. Gunakanpdb> !list(newdict.keys())
untuk menghindari perintah pdb..keys()
jauh lebih jelas tentang apa yang terjadi.Python> = 3,5 alternatif: buka paket ke daftar literal
[*newdict]
Generalisasi unpacking baru (PEP 448) diperkenalkan dengan Python 3.5 yang memungkinkan Anda sekarang dengan mudah melakukannya:
Membongkar dengan
*
karya dengan objek apa pun yang dapat diubah dan, karena kamus mengembalikan kunci mereka saat diulangi, Anda dapat dengan mudah membuat daftar dengan menggunakannya dalam daftar literal.Menambahkan
.keys()
mis.[*newdict.keys()]
Mungkin membantu dalam membuat maksud Anda sedikit lebih eksplisit meskipun itu akan membebani Anda fungsi pencarian dan doa. (yang, dalam semua kejujuran, bukan sesuatu yang harus benar-benar khawatir tentang).The
*iterable
sintaks mirip dengan melakukanlist(iterable)
dan perilakunya awalnya didokumentasikan dalam bagian Panggilan dari manual Python Referensi. Dengan PEP 448 pembatasan di mana*iterable
bisa muncul dilonggarkan memungkinkan untuk juga ditempatkan dalam daftar, set dan tuple literal, manual referensi pada daftar Ekspresi juga diperbarui untuk menyatakan ini.Meskipun setara
list(newdict)
dengan perbedaan yang lebih cepat (setidaknya untuk kamus kecil) karena tidak ada pemanggilan fungsi yang benar-benar dilakukan:dengan kamus yang lebih besar kecepatannya hampir sama (overhead iterasi melalui koleksi besar mengalahkan biaya panggilan fungsi yang kecil).
Dengan cara yang sama, Anda dapat membuat tupel dan set kunci kamus:
Waspadalah terhadap koma yang tertinggal di kotak tuple!
sumber
def foo(*args): print(args)
diikutifoo(*{1:0, 2:0})
dengan hasil yang(1, 2)
sedang dicetak. Perilaku ini ditentukan di bagian Panggilan dalam manual referensi. Python 3.5 dengan PEP 448 hanya melonggarkan pembatasan di mana ini dapat muncul memungkinkan[*{1:0, 2:0}]
untuk sekarang digunakan. Either way, saya akan mengedit jawaban saya dan memasukkan ini.*newdict
- ini jelas merupakan jawaban untuk pegolf kode; P. Juga: yang, dalam semua kejujuran, bukan sesuatu yang harus Anda khawatirkan - dan jika ya, jangan gunakan python .list(newdict)
bekerja di kedua Python 2 dan Python 3, memberikan daftar kunci sederhana dinewdict
.keys()
tidak perlu. (:sumber
Sedikit tentang definisi "mengetik bebek" -
dict.keys()
mengembalikan objek iterable, bukan objek seperti daftar. Ini akan bekerja di mana saja iterable akan bekerja - tidak ada tempat daftar akan. daftar juga merupakan iterable, tetapi iterable BUKAN daftar (atau urutan ...)Dalam kasus penggunaan nyata, hal yang paling umum dilakukan dengan kunci dalam dikte adalah untuk beralih melalui mereka, jadi ini masuk akal. Dan jika Anda membutuhkannya sebagai daftar, Anda dapat menelepon
list()
.Sangat mirip untuk
zip()
- dalam sebagian besar kasus, iterasi melalui - mengapa membuat daftar tuple baru hanya untuk beralih melalui itu dan kemudian membuangnya lagi?Ini adalah bagian dari tren besar dalam python untuk menggunakan lebih banyak iterator (dan generator), daripada salinan daftar di semua tempat.
dict.keys()
harus bekerja dengan pemahaman, meskipun - periksa dengan teliti untuk kesalahan ketik atau sesuatu ... itu berfungsi dengan baik untuk saya:sumber
.keys()
; obyek kamus itu sendiri iterable dan menghasilkan kunci ketika iterasi berakhir:[key.split(", ") for key in d]
.Anda juga dapat menggunakan pemahaman daftar :
Atau, lebih pendek,
Catatan: Pesanan tidak dijamin pada versi di bawah 3.7 (pemesanan masih hanya detail implementasi dengan CPython 3.6).
sumber
list(newdict)
. Tidak perlu untuk memahami daftar di sini.Konversi ke daftar tanpa menggunakan
keys
metode membuatnya lebih mudah dibaca:dan, ketika menggunakan kamus, tidak perlu
keys()
:kecuali Anda memodifikasinya dalam loop yang akan membutuhkan daftar kunci yang dibuat sebelumnya:
Di Python 2 ada keuntungan kinerja marjinal menggunakan
keys()
.sumber
Jika Anda perlu menyimpan kunci secara terpisah, inilah solusi yang membutuhkan pengetikan lebih sedikit daripada setiap solusi lain yang disajikan sejauh ini, menggunakan Extended Iterable Unpacking (python3.x +).
sumber
k
adalah selalu ada daftar di sini. Jika pengguna menginginkan tuple atau set dari tombol, mereka harus kembali ke opsi lain.*k, = d
memiliki batasan di mana ia dapat muncul (tapi lihat, dan mungkin perbarui jawaban ini untuk, PEP 572 - pembongkaran yang diperluas tidak didukung untuk penugasan ekspresi atm tetapi mungkin suatu hari nanti! )keys, vals = zip(*d.items())
(meskipun itu memberi dua tupel, cukup dekat). Saya tidak tahu ekspresi yang lebih pendek dari ini.Saya dapat memikirkan 2 cara di mana kita dapat mengekstrak kunci dari kamus.
Metode 1: - Untuk mendapatkan kunci menggunakan metode .keys () dan kemudian mengonversinya menjadi daftar.
Metode 2: - Untuk membuat daftar kosong dan kemudian menambahkan kunci ke daftar melalui loop. Anda bisa mendapatkan nilai dengan loop ini juga (gunakan .keys () hanya untuk kunci dan .items () untuk ekstraksi kunci dan nilai)
sumber