misalkan saya memiliki jumlah buah dengan warna berbeda, misal, 24 pisang biru, 12 apel hijau, 0 stroberi biru, dan seterusnya. Saya ingin mengaturnya dalam struktur data dengan Python yang memungkinkan pemilihan dan penyortiran yang mudah. Ide saya adalah memasukkannya ke dalam kamus dengan tupel sebagai kuncinya, misalnya,
{ ('banana', 'blue' ): 24,
('apple', 'green'): 12,
('strawberry','blue' ): 0,
...
}
atau bahkan kamus, misalnya,
{ {'fruit': 'banana', 'color': 'blue' }: 24,
{'fruit': 'apple', 'color': 'green'}: 12,
{'fruit': 'strawberry','color': 'blue' }: 0,
...
}
Saya ingin mengambil daftar semua buah biru, atau pisang semua warna, misalnya, atau mengurutkan kamus ini berdasarkan nama buahnya. Adakah cara untuk melakukan ini dengan cara yang bersih?
Mungkin kamus dengan tupel sebagai kunci bukanlah cara yang tepat untuk menangani situasi ini.
Semua saran diterima!
Jawaban:
Secara pribadi, salah satu hal yang saya suka tentang python adalah kombinasi tuple-dict. Apa yang Anda miliki di sini secara efektif adalah array 2d (di mana x = nama buah dan y = warna), dan saya biasanya adalah pendukung dikt tupel untuk mengimplementasikan array 2d, setidaknya ketika sesuatu seperti
numpy
atau database tidak lebih sesuai . Singkatnya, saya pikir Anda memiliki pendekatan yang baik.Perhatikan bahwa Anda tidak dapat menggunakan dicts sebagai kunci dalam sebuah dict tanpa melakukan pekerjaan ekstra, jadi itu bukan solusi yang sangat baik.
Karena itu, Anda juga harus mempertimbangkan nametuple () . Dengan cara itu Anda bisa melakukan ini:
Sekarang Anda dapat menggunakan dikt akun buah Anda:
Trik lainnya:
Menggema chmullig, untuk mendapatkan daftar semua warna dari satu buah, Anda harus menyaring tombolnya, yaitu
sumber
name='banana'
?bananas = filter(lambda fruit: fruit.name=='banana', fruits)
ataubananas = [fruit for fruit in fruits if fruit.name=='banana']
. Ini adalah salah satu cara di mana dicts bersarang berpotensi lebih efisien; semuanya bermuara pada cara Anda berencana menggunakan data.count
Pilihan terbaik Anda adalah membuat struktur data sederhana untuk memodelkan apa yang Anda miliki. Kemudian Anda dapat menyimpan objek ini dalam daftar sederhana dan mengurutkan / mengambilnya sesuka Anda.
Untuk kasus ini, saya akan menggunakan kelas berikut:
Kemudian Anda cukup membuat instance "Buah" dan menambahkannya ke daftar, seperti yang ditunjukkan dengan cara berikut:
Daftar sederhana
fruits
akan jauh lebih mudah, tidak membingungkan, dan lebih terawat.Beberapa contoh penggunaan:
Semua keluaran di bawah ini adalah hasil setelah menjalankan cuplikan kode yang diberikan diikuti oleh:
Daftar yang tidak diurutkan:
Menampilkan:
Diurutkan menurut abjad berdasarkan nama:
Menampilkan:
Diurutkan berdasarkan kuantitas:
Menampilkan:
Dimana warna == merah:
Menampilkan:
sumber
Database, diktik, kamus daftar kamus, bernama tuple (itu subclass), sqlite, redundansi ... Saya tidak percaya dengan mata saya. Apa lagi ?
Ya! saya pikir
Jadi, menurut saya, daftar tupelnya cukup banyak:
hasil
sumber
Kamus mungkin bukanlah yang seharusnya Anda gunakan dalam kasus ini. Perpustakaan berfitur lebih lengkap akan menjadi alternatif yang lebih baik. Mungkin database sungguhan. Yang termudah adalah sqlite . Anda dapat menyimpan semuanya dalam memori dengan memasukkan string ': memory:' alih-alih nama file.
Jika Anda ingin melanjutkan jalur ini, Anda dapat melakukannya dengan atribut tambahan di kunci atau nilainya. Bagaimanapun kamus tidak bisa menjadi kunci untuk kamus lain, tapi tuple bisa. Dokumen menjelaskan apa yang diperbolehkan. Ini harus berupa objek yang tidak dapat diubah, yang mencakup string, angka, dan tupel yang hanya berisi string dan angka (dan lebih banyak tupel yang hanya berisi tipe tersebut secara rekursif ...).
Anda dapat melakukan contoh pertama dengan
d = {('apple', 'red') : 4}
, tetapi akan sangat sulit untuk menanyakan apa yang Anda inginkan. Anda perlu melakukan sesuatu seperti ini:sumber
Dengan kunci sebagai tupel, Anda cukup memfilter kunci dengan komponen kedua yang diberikan dan mengurutkannya:
Penyortiran berfungsi karena tupel memiliki susunan alami jika komponennya memiliki susunan alami.
Dengan kunci sebagai objek yang cukup lengkap, Anda cukup memfilter
k.color == 'blue'
.Anda tidak dapat benar-benar menggunakan dicts sebagai kunci, tetapi Anda dapat membuat kelas paling sederhana seperti
class Foo(object): pass
dan menambahkan atribut apa pun padanya dengan cepat:Instance ini dapat berfungsi sebagai kunci dict, tetapi waspadalah terhadap mutabilitasnya!
sumber
Anda bisa memiliki kamus yang isinya adalah daftar kamus lain:
Keluaran:
Sunting: Seperti yang ditunjukkan oleh eumiro, Anda dapat menggunakan kamus kamus:
Keluaran:
sumber
Jenis data ini ditarik secara efisien dari struktur data seperti Trie. Ini juga memungkinkan penyortiran cepat. Efisiensi memori mungkin tidak terlalu bagus.
Trie tradisional menyimpan setiap huruf dari sebuah kata sebagai simpul di pohon. Tetapi dalam kasus Anda "alfabet" Anda berbeda. Anda menyimpan string, bukan karakter.
mungkin terlihat seperti ini:
lihat tautan ini: trie dengan python
sumber
Anda ingin menggunakan dua kunci secara terpisah, jadi Anda memiliki dua pilihan:
Simpan data secara berlebihan dengan dua dicts sebagai
{'banana' : {'blue' : 4, ...}, .... }
dan{'blue': {'banana':4, ...} ...}
. Kemudian, mencari dan menyortir itu mudah tetapi Anda harus memastikan Anda memodifikasi dicts bersama-sama.Simpan hanya satu perintah, lalu tulis fungsi yang mengulanginya, misalnya:
sumber