Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimanakah Saya Boleh Melaksanakan Kamus Bersarang dalam Python dengan Cekap?

Bagaimanakah Saya Boleh Melaksanakan Kamus Bersarang dalam Python dengan Cekap?

DDD
Lepaskan: 2024-12-23 04:54:22
asal
459 orang telah melayarinya

How Can I Efficiently Implement Nested Dictionaries in Python?

Melaksanakan Kamus Bersarang menggunakan Subkelas dengan __hilang__

Melaksanakan subkelas dict dan mengatasi kaedah __missing__ ialah pendekatan kreatif untuk mencipta kamus bersarang. Kaedah ini menyediakan cara untuk memintas dan mengendalikan kunci yang hilang dengan anggun. Begini caranya:

  1. Subkelas dict: Tentukan kelas baharu, seperti Vividict, yang diwarisi daripada dict.
  2. Timpa __hilang__: Dalam subkelas anda, tentukan kaedah __missing__ yang mengendalikan kekunci hilang. Dalam kaedah ini, anda boleh mencipta contoh baharu subkelas dan menetapkannya sebagai nilai untuk kunci yang hilang.

Berikut ialah contoh pelaksanaan Vividict:

class Vividict(dict):
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value
Salin selepas log masuk

Menggunakan subkelas ini, anda boleh mencipta kamus bersarang dengan cepat:

d = Vividict()
d['foo']['bar'] = 1
d['foo']['baz'] = 2
print(d)  # {'foo': {'bar': 1, 'baz': 2}}
Salin selepas log masuk

Pendekatan ini menawarkan sintaks yang bersih untuk mengisi kamus bersarang dan memudahkan proses mencipta struktur hierarki yang kompleks.

Alternatif Lain

Selain menggunakan subkelas tersuai dengan __missing__, berikut ialah beberapa alternatif lain untuk bersarang kamus:

1. dict.setdefault:

Menggunakan dict.setdefault menyediakan cara ringkas untuk mencipta kamus bersarang, tetapi sintaksnya boleh digunakan untuk struktur kompleks.

d = {}
d.setdefault('foo', {}).setdefault('bar', []).append(1)
d.setdefault('foo', {}).setdefault('baz', []).append(2)
print(d)  # {'foo': {'bar': [1], 'baz': [2]}}
Salin selepas log masuk

2. Auto-vivified defaultdict:

defaultdict daripada modul koleksi boleh digunakan untuk mencipta kamus auto-vivified yang mencipta kamus bersarang secara automatik mengikut keperluan. Walau bagaimanapun, pendekatan ini boleh membawa kepada keluaran yang bersepah apabila menyahpepijat atau memeriksa data.

from collections import defaultdict

def vivdict():
    return defaultdict(vivdict)

d = vivdict()
d['foo']['bar'] = 1
d['foo']['baz'] = 2
print(d)  # defaultdict(...defaultdict(...defaultdict(...))), etc.
Salin selepas log masuk

3. Kunci Tuple:

Daripada menggunakan kamus bersarang, pertimbangkan untuk menggunakan tupel sebagai kunci. Pendekatan ini memudahkan lelaran dan pengagregatan tetapi boleh membawa kepada kod yang lebih kompleks dari segi sintaksis untuk mengurus subset kamus.

d = {('foo', 'bar'): 1, ('foo', 'baz'): 2}
Salin selepas log masuk

Pertimbangan Prestasi

Mengenai prestasi, dict .setdefault secara amnya adalah yang paling cekap untuk kod pengeluaran. Walau bagaimanapun, untuk kegunaan interaktif di mana kelajuan pelaksanaan kurang kritikal, Vividict boleh menyediakan penyelesaian yang lebih mudah dan boleh dibaca.

Kesimpulan

Melaksanakan kamus bersarang dengan subkelas dan __missing__ menawarkan pendekatan yang berkuasa dan fleksibel yang boleh disesuaikan dengan kes penggunaan tertentu. Walaupun ia mungkin memperkenalkan beberapa kemungkinan perangkap, ia juga memberikan kelebihan dari segi kebolehbacaan kod dan manipulasi data. Kaedah alternatif, seperti dict.setdefault dan auto-vivified defaultdict, berfungsi untuk tujuan mereka sendiri dengan pelbagai tahap prestasi dan kebolehbacaan output.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Kamus Bersarang dalam Python dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan