ハッシュのキーと値を反転する - lisp-cookbook-ja/common-lisp GitHub Wiki

ハッシュテーブル

ハッシュのキーと値を反転する

値からキーを検索したいことがありますが、キーと値の逆転は下記のように書けるでしょう。(FIXME)

キーと値の両方から検索する場合、alistassoc/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

議論