ハッシュのキーと値を反転する - lisp-cookbook-ja/common-lisp GitHub Wiki
ハッシュのキーと値を反転する
値からキーを検索したいことがありますが、キーと値の逆転は下記のように書けるでしょう。(FIXME)
キーと値の両方から検索する場合、alistとassoc/rassocの組み合わせも検討できるでしょう。
;; 逆転に際してキーの重複は後のものが有効
(defun invert (table &key (test #'eql))
(let ((newtab (make-hash-table :test test)))
(maphash (lambda (k v)
(setf (gethash v newtab) k))
table)
newtab))
;; 実行例
(let ((turtles (alexandria:plist-hash-table
'(Howard-Kaylan (Musician Lead-Singer)
John-Barbata (Musician Drummer)
Leonardo (Ninja Leader Blue)
Donatello (Ninja Machines Purple)
Al-Nichol (Musician Guitarist)
Mark-Volman (Musician Great-Hair)
Raphael (Ninja Cool Rude Red)
Michaelangelo (Ninja Party-Dude Orange)
Jim-Pons (Musician Bassist)))))
(gethash '(musician bassist) (invert turtles :test #'equal)))
;=> JIM-PONS
; T