Saya melakukan hal switchboard ini dengan python di mana saya perlu melacak siapa yang berbicara dengan siapa, jadi jika Alice -> Bob, maka itu berarti Bob -> Alice.
Ya, saya dapat mengisi dua peta hash, tetapi saya ingin tahu apakah ada yang punya ide untuk melakukannya dengan satu peta.
Atau sarankan struktur data lain.
Tidak ada banyak percakapan. Katakanlah ini untuk pusat panggilan layanan pelanggan, jadi ketika Alice menelepon ke telepon, dia hanya akan berbicara dengan Bob. Jawabannya juga hanya ditujukan padanya.
Jawaban:
Anda dapat membuat jenis kamus Anda sendiri dengan membuat subclass
dict
dan menambahkan logika yang Anda inginkan. Berikut contoh dasarnya:Dan cara kerjanya seperti ini:
Saya yakin saya tidak membahas semua kasus, tetapi itu akan membantu Anda memulai.
sumber
.add
metode sehingga Anda dapat melakukan hal-hal sepertid.add('Bob', 'Alice')
daripada menggunakan sintaks yang saya tunjukkan. Saya juga akan menyertakan beberapa penanganan kesalahan. Tapi Anda mendapatkan ide dasarnya. :)d['foo'] = 'baz'
perlu juga menghapusbar
kunci).dict
menghasilkan beberapa perilaku menyesatkan di sini, karena jika Anda membuat objek dengan beberapa konten awal, strukturnya akan rusak.__init__
perlu diganti agar konstruksi sepertid = TwoWayDict({'foo' : 'bar'})
bekerja dengan baik.pip install bidict
. URL: pypi.python.org/pypi/bidictDalam kasus khusus Anda, Anda dapat menyimpan keduanya dalam satu kamus:
Karena yang Anda gambarkan adalah hubungan simetris.
A -> B => B -> A
sumber
Saya tahu ini pertanyaan lama, tetapi saya ingin menyebutkan solusi hebat lain untuk masalah ini, yaitu bidik paket python . Ini sangat mudah digunakan:
sumber
Saya hanya akan mengisi hash kedua, dengan
sumber
reverse_map = dict(reversed(item) for item in forward_map.items())
my_dict.update(dict(reversed(item) for item in my_dict.items()))
Unexpected type(s): (Generator[Iterator[Union[str, Any]], Any, None]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
. Ada ide bagaimana cara menghilangkan peringatan?Dua peta hash sebenarnya mungkin solusi berkinerja tercepat dengan asumsi Anda dapat menyisihkan memori. Saya akan membungkusnya dalam satu kelas - beban pada programmer adalah memastikan bahwa dua peta hash disinkronkan dengan benar.
sumber
mydict[:value]
untuk memperolehkey
(dengan mengorbankan beberapa performa)Anda memiliki dua masalah terpisah.
Anda memiliki objek "Percakapan". Ini mengacu pada dua Pribadi. Karena Seseorang dapat melakukan banyak percakapan, Anda memiliki hubungan banyak-ke-banyak.
Anda memiliki Peta dari Orang ke daftar Percakapan. Sebuah Konversi akan memiliki sepasang Orang.
Lakukan sesuatu seperti ini
sumber
Tidak, tidak ada cara untuk melakukan ini tanpa membuat dua kamus. Bagaimana mungkin menerapkan ini hanya dengan satu kamus sambil terus menawarkan kinerja yang sebanding?
Anda lebih baik membuat tipe kustom yang merangkum dua kamus dan memperlihatkan fungsionalitas yang Anda inginkan.
sumber
Cara yang tidak terlalu bertele-tele, masih menggunakan terbalik:
sumber
Anda mungkin dapat menggunakan
DoubleDict
seperti yang ditunjukkan pada resep 578224 di Python Cookbook .sumber
Solusi lain yang mungkin adalah mengimplementasikan subkelas dari
dict
, yang menyimpan kamus asli dan melacak versi kebalikannya. Menjaga dua dicts terpisah dapat berguna jika kunci dan nilai tumpang tindih.Contoh:
sumber
Ada perpustakaan tambahan koleksi di pypi: https://pypi.python.org/pypi/collections-extended/0.6.0
Menggunakan kelas bijection semudah:
sumber
Saya suka saran bidikt di salah satu komentar.
pip install bidict
Penggunaan:
Karena tidak banyak dokumen tentang itu. Tapi saya punya semua fitur yang saya butuhkan dari itu bekerja dengan benar.
Cetakan:
sumber
Modul ekstensi kjbuckets C menyediakan struktur data "grafik" yang menurut saya memberikan apa yang Anda inginkan.
sumber
Berikut satu lagi implementasi kamus dua arah dengan memperluas
dict
kelas ular sanca jika Anda tidak menyukai yang lain:Gunakan sebagai kamus python normal kecuali dalam konstruksi:
sumber
Cara yang saya suka untuk melakukan hal semacam ini adalah seperti:
sumber