Apakah ada cara untuk mengganti nama kunci kamus, tanpa menetapkan kembali nilainya ke nama baru dan menghapus kunci nama lama; dan tanpa iterasi melalui kunci / nilai dict?
Dalam kasus OrderedDict, lakukan hal yang sama, sambil menjaga posisi kunci itu.
python
dictionary
associative-array
ordereddictionary
rabin utam
sumber
sumber
OrderedDict
. dikte mengabaikan ketertiban ketika mereka dibandingkan untuk kesetaraan, sedangkanOrderedDict
memperhitungkannya ketika dibandingkan. Saya tahu Anda menautkan ke sesuatu yang menjelaskannya, tetapi saya pikir komentar Anda mungkin telah menyesatkan mereka yang mungkin tidak membaca tautan itu.OrderedDict
memperhitungkan pesanan ketika dibandingkan" Ok tapi tidak ada yang peduli pasca-3.7. Saya mengklaimOrderedDict
sebagian besar sudah usang, dapatkah Anda mengartikulasikan alasan mengapa tidak? misalnya di sini tidak persuasif kecuali Anda perlureversed()
Jawaban:
Untuk dikte reguler, Anda dapat menggunakan:
Untuk OrderedDict, saya pikir Anda harus membangun yang sama sekali baru menggunakan pemahaman.
Mengubah kunci itu sendiri, seperti yang tampaknya ditanyakan oleh pertanyaan ini, tidak praktis karena kunci dikt biasanya merupakan objek yang tidak dapat diubah seperti angka, string, atau tupel. Alih-alih mencoba memodifikasi kunci, menugaskan kembali nilai ke kunci baru dan menghapus kunci lama adalah bagaimana Anda dapat mencapai "ganti nama" dengan python.
sumber
dict.pop
bisa diterapkan untuk OrderedDict berdasarkan pengujian saya.OrderedDict
akan mempertahankan urutan penyisipan, yang bukan pertanyaan yang ditanyakan.metode terbaik dalam 1 baris:
sumber
d = {('test', 'foo'):[0,1,2]}
?d[('new', 'key')] = d.pop(('test', 'foo'))
Menggunakan tanda centang untuk
newkey!=oldkey
, cara ini dapat Anda lakukan:sumber
dict
pesanan, bahkan jika python3.6 + menginternalisasi itu dalam bentuk yang dipesan, versi sebelumnya tidak dan itu bukan fitur hanya efek samping dari bagaimana perubahan py3.6 + dikt. GunakanOrderedDict
jika Anda peduli tentang pesanan.Jika mengganti nama semua kunci kamus:
sumber
target_dict.keys()
dijamin sama dengan definisi? Saya pikir dict Python tidak teratur, dan urutan dari tampilan kunci dict tidak dapat diprediksiAnda dapat menggunakan ini yang
OrderedDict recipe
ditulis oleh Raymond Hettinger dan memodifikasinya untuk menambahkanrename
metode, tetapi ini akan menjadi O (N) dalam kompleksitas:Contoh:
keluaran:
sumber
OrderedDict
dari itu. Tetapi saya akan merekomendasikan: Buat kelas yang mewarisi dariOrderedDict
dan menambahkanrename
metode untuk itu.Beberapa orang sebelum saya menyebutkan
.pop
trik untuk menghapus dan membuat kunci dalam satu baris.Saya pribadi menemukan implementasi yang lebih eksplisit lebih mudah dibaca:
Kode di atas kembali
{'a': 1, 'c': 2}
sumber
Jawaban lain cukup bagus. Namun dalam python3.6, perintah reguler juga memiliki urutan. Jadi sulit untuk mempertahankan posisi kunci dalam kasus normal.
sumber
Dalam Python 3.6 (seterusnya?) Saya akan pergi untuk satu-liner berikut
yang menghasilkan
Mungkin perlu dicatat bahwa tanpa
print
pernyataan konsol ipython / notebook jupyter menyajikan kamus dalam urutan pilihan mereka ...sumber
Saya datang dengan fungsi ini yang tidak mengubah kamus asli. Fungsi ini juga mendukung daftar kamus juga.
sumber
Saya menggunakan jawaban @wim di atas, dengan dict.pop () ketika mengganti nama kunci, tetapi saya menemukan gotcha. Bersepeda melalui dict untuk mengubah kunci, tanpa memisahkan daftar kunci lama sepenuhnya dari instance dict, menghasilkan bersepeda baru, mengubah kunci menjadi loop, dan kehilangan beberapa kunci yang ada.
Untuk memulainya, saya melakukannya dengan cara ini:
Saya menemukan bahwa bersepeda melalui dikt dengan cara ini, kamus terus menemukan kunci bahkan ketika seharusnya tidak, yaitu kunci baru, yang telah saya ubah! Saya perlu memisahkan instans sepenuhnya dari satu sama lain untuk (a) menghindari menemukan kunci saya sendiri yang diubah dalam for loop, dan (b) menemukan beberapa kunci yang tidak ditemukan dalam loop karena suatu alasan.
Saya melakukan ini sekarang:
Mengubah my_dict.keys () ke daftar diperlukan untuk membebaskan referensi ke perubahan dict. Hanya menggunakan my_dict.keys () membuat saya terikat dengan contoh aslinya, dengan efek samping yang aneh.
sumber
Jika seseorang ingin mengganti nama semua kunci sekaligus memberikan daftar dengan nama baru:
sumber
@ helloswift123 Saya suka fungsi Anda. Berikut ini adalah modifikasi untuk mengganti nama beberapa kunci dalam satu panggilan:
sumber
Misalkan Anda ingin mengganti nama kunci k3 menjadi k4:
sumber
TypeError: 'dict' object is not callable
Jika dengantemp_dict('k3')
Anda mencoba untuk referensi nilaik3
kunci maka Anda harus menggunakan tanda kurung dan bukan tanda kurung. Namun, ini hanya akan menambahkan kunci baru ke kamus dan tidak akan mengganti nama kunci yang ada, seperti yang diminta.