我想转换这个列表列表:
(setq terms '((("name" . "t1c1")
("taxonomy" . "category"))
(("name" . "t1c2")
("taxonomy" . "category"))
(("name" . "t1k1")
("taxonomy" . "post_tag"))
(("name" . "t1k2")
("taxonomy" . "post_tag"))
(("name" . "t1k3")
("taxonomy" . "post_tag"))))
进入其他列表:
(("category" "t1c1" "t1c2")
("post_tag" "t1k1" "t1k2" "t1k3"))
我想出了:
(reduce
'(lambda (lists term)
(let* ((name (cdr (assoc "name" term)))
(taxonomy (cdr (assoc "taxonomy" term)))
(existing (assoc taxonomy lists)))
(if existing
(progn
(setcdr existing (sort (cons name (cdr existing)) 'string<)))
(push (list taxonomy name) lists)))
lists)
terms
:initial-value nil)
这看起来很不雅—— let* 和 if 语句的使用看起来都像是潜在的代码异味。
我会很感激在 elisp 中执行此操作的任何更好方法的示例——更好可能意味着更纯粹的功能,更好地使用内置函数来表示某些操作等。
哦,我想对结果列表的内容进行排序——这让我更容易测试输出。