Saya mengalami masalah dalam menggunakan collections.OrderedDict
kelas. Saya menggunakan Python 2.7 di Raspbian, distro Debian untuk Raspberry Pi. Saya mencoba mencetak dua kamus untuk perbandingan (berdampingan) untuk petualangan teks. Urutan ini penting untuk membandingkan secara akurat. Apa pun yang saya coba, kamus cetak dengan cara yang tidak teratur seperti biasanya.
Inilah yang saya dapatkan ketika saya melakukannya di RPi saya:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
Jelas ada sesuatu yang tidak beres karena ia mencetak panggilan fungsi dan meletakkan kunci dan grup nilai ke dalam daftar bersarang ...
Inilah yang saya dapatkan dengan menjalankan sesuatu yang serupa pada PC saya:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
Kali ini, ini sudah beres, tetapi seharusnya tidak mencetak hal-hal lain kan? (The memasukkannya ke dalam daftar dan menunjukkan panggilan fungsi.)
Di mana saya membuat kesalahan? Seharusnya tidak ada hubungannya dengan versi pi Python karena hanya versi Linux.
sumber
OrderedDict
diurutkan berdasarkan urutan penyisipan, bukan urutan kunci alfanumerik.Jawaban:
Anda membuat kamus terlebih dahulu , lalu meneruskan kamus itu ke
OrderedDict
. Untuk versi Python <3.6 (*) , saat Anda melakukan itu, pemesanan tidak lagi benar.dict
secara inheren tidak dipesan.Sebagai gantinya, masukkan urutan tuple:
Apa yang Anda lihat ketika Anda mencetak
OrderedDict
adalah itu representasi , dan itu adalah sepenuhnya benar.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
hanya menunjukkan kepada Anda, dalam representasi yang dapat direproduksi , apa isinyaOrderedDict
.(*) : Dalam pelaksanaan CPython 3.6, yang
dict
jenis telah diupdate untuk menggunakan memori lebih struktur internal yang efisien yang memiliki efek samping bahagia menjaga ketertiban penyisipan, dan dengan perpanjangan kode yang ditunjukkan dalam karya pertanyaan tanpa masalah. Pada Python 3.7, spesifikasi bahasa Python telah diperbarui untuk mewajibkan semua implementasi Python harus mengikuti perilaku ini. Lihat jawaban saya yang lain ini untuk perincian dan juga mengapa Anda mungkin masih ingin menggunakanOrderedDict()
untuk kasus-kasus tertentu.sumber
print ship
?? Terima kasih :)OrderedDict
itu dibuat itu adalah kamus.Jika Anda tidak dapat mengedit bagian kode ini di mana definisi Anda ditetapkan, Anda masih dapat memesannya kapan saja dengan cara apa pun yang Anda inginkan, seperti ini:
sumber
Sebagian besar waktu kami menggunakan OrderedDict ketika kami membutuhkan pesanan khusus bukan yang umum seperti ASC dll.
Inilah solusi yang diusulkan:
Ini akan menjadi output:
Catatan : Kamus yang diurutkan baru mempertahankan urutan pengurutannya ketika entri dihapus. Tetapi ketika kunci baru ditambahkan, kunci ditambahkan ke akhir dan jenisnya tidak dipertahankan. ( Dokumen resmi )
sumber
Gunakan dict.items (); dapat sesederhana seperti berikut:
sumber