gpt4 book ai didi

emacs - 在 elisp 中按值添加两个列表

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:25 25 4
gpt4 key购买 nike

我有两个形式的点对列表:

(((key1 . value1) . 5)
((key2 . value2) . 7))

(((key2 . value2) . 3)
((key3 . value3) . 9))

我希望结果是一个关联列表:

(((key1 . value1) . 5)
((key2 . value2) . 10)
((key3 . value3) . 9))

如何在 emacs lisp 中按值添加两个关联列表?换句话说,如果两个列表具有相同的键,则该键的值应添加到结果列表中。

最可能的答案是一些 elisp 片段,但我也更喜欢漂亮的 emacs 宏。

最佳答案

使用 CL 模块的解决方案(编写时考虑的是可读性而不是效率):

(require 'cl)

(defun merge-alists (function default alist1 alist2)
(flet ((keys (alist) (mapcar #'car alist))
(lookup (key alist) (or (cdr (assoc key alist)) default)))
(loop with keys = (union (keys alist1) (keys alist2) :test 'equal)
for k in keys collect
(cons k (funcall function (lookup k alist1) (lookup k alist2))))))

你可以这样使用它:

elisp> (merge-alists '+ 0 '((foo . 1) (bar . 2)) '((foo . 11) (baz . 22)))
((baz . 22)
(foo . 12)
(bar . 2))

elisp> (merge-alists '* 1 '((foo . 1) (bar . 2)) '((foo . 11) (baz . 22)))
((baz . 22)
(foo . 11)
(bar . 2))

elisp> (merge-alists 'append '() '((foo a b) (bar c)) '((foo d e) (baz f g)))
((baz f g)
(foo a b d e)
(bar c))

elisp> (setq my-alist1 '(((key1 . value1) . 5) ((key2 . value2) . 7)))
(((key1 . value1) . 5)
((key2 . value2) . 7))

elisp> (setq my-alist2 '(((key2 . value2) . 3) ((key3 . value3) . 9)))
(((key2 . value2) . 3)
((key3 . value3) . 9))

elisp> (merge-alists '+ 0 my-alist1 my-alist2)
(((key3 . value3) . 9)
((key1 . value1) . 5)
((key2 . value2) . 10))

关于emacs - 在 elisp 中按值添加两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com