3

假设我有一个 cons 单元格列表,如下所示:

(setq foo '(("a" . 1) ("b" . 2) ("c" . 3)))

我想通过“键名”检索特定 cons 单元格的值。有没有可以让我这样做的功能?

例如

(get-by-key "a" foo) ;; => 1

或类似的东西。提前致谢!

4

3 回答 3

12

这样的列表称为关联列表,简称alist。形式上,关联列表是键及其关联值的组合列表。

assoc功能是您正在寻找的。它接受一个键和一个 alist 作为其参数,并返回 alist 中键的第一个关联equal

ELISP> (setq foo '(("a" . 1) ("b" . 2) ("c" . 3)))
(("a" . 1)
 ("b" . 2)
 ("c" . 3))

ELISP> (assoc "a" foo)
("a" . 1)

ELISP> (cdr (assoc "a" foo))
1

assoc-string函数类似于该assoc函数,但特定于其键为字符串的关联列表。除了 key 和 alist 之外,它还可以采用另一个可选参数,使 key 比较不区分大小写:

ELISP> (assoc-string "a" foo)
("a" . 1)

ELISP> (assoc-string "A" foo)
nil

ELISP> (assoc-string "A" foo t)
("a" . 1)

有关关联列表相关函数的完整列表,请参阅GNU Emacs Lisp 参考手册

于 2012-10-05T22:41:09.983 回答
3

assoc-default允许您通过“键名”检索特定 cons 单元格的值。

ELISP> (setq foo '(("a" . 1) ("b" . 2) ("c" . 3)))
(("a" . 1)
 ("b" . 2)
 ("c" . 3))

ELISP> (assoc-default "a" foo)
1
于 2019-04-25T09:19:55.100 回答
2

alist-get以 KEY 和 ALIST 作为参数为您提供与 KEY 关联的 VALUE。例如,

(alist-get 'a '((a . 1) (b . 2) (c . 3)))

评估为 1。

默认情况下进行比较eq。但它的完整参数列表是:

(alist-get KEY ALIST &optional DEFAULT REMOVE TESTFN)

所以可以给出:

  1. 如果 KEY 不匹配,则返回一个 DEFAULT 值,
  2. 如果新值为 DEFAULT,则删除 KEY VALUE 对的标志 REMOVE
(setf (alist-get KEY ALIST DEFAULT t) DEFAULT)
  1. TESTFNKEY 与 ALIST 的汽车比较的测试功能
于 2021-02-26T22:59:45.230 回答