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
DDDasal
2024-12-23 04:54:22463semak imbas

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

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}}

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]}}

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.

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}

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!

Kenyataan:
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