【发布时间】:2012-08-11 04:56:45
【问题描述】:
我需要找到一个特定的值,该值可以隐藏在一个深度嵌套的列表中,而且永远不会在同一个地方。甚至同样的深度;这是列表的一种形式:
(setq my-list '(((partnum . 1) (type (TEXT . plain)) (body (charset UTF-8))
(disposition nil) (transfer-encoding QUOTED-PRINTABLE))
((partnum . 2) (type (TEXT . html)) (body (charset UTF-8))
(disposition nil) (transfer-encoding QUOTED-PRINTABLE))))
现在我需要检索 "charset" 的值;如果有的话,第一个。在这种配置中,很容易:
(car (cdr (cadr (third (car my-list)))))
=> UTF-8
但这是我确切知道“身体”单元格在哪里的时候。
我尝试像这样递归地使用 mapcar:
(defun search-rec (list)
(mapcar
(lambda (x)
(if (listp x)
(search-rec x)
(message "OY %s" x)))
list))
但每次,当递归命中第一个 cons 单元的第一个原子时,我都会收到错误 (wrong-type-argument listp 1)。我想我的问题真的是它是什么:
如何在列表中搜索?
编辑 现在列表看起来像这样,“charset”仍在 (body) 中(告诉你这是唯一不变的东西)并且不再找到它:(
(setq my-list '(((partnum . 1)
(1.1 (type (TEXT . plain)) (body (charset UTF-8))
(disposition nil) (transfer-encoding 7BIT))
(1.2 (type (TEXT . html)) (body (charset UTF-8))
(disposition nil) (transfer-encoding 7BIT))
(type . alternative) (body (boundary e89a8fb2067eba300404c63c5f7f))
(disposition nil) (transfer-encoding nil))
((partnum . 1.1) (type (TEXT . plain)) (body (charset UTF-8))
(disposition nil) (transfer-encoding 7BIT))
((partnum . 1.2) (type (TEXT . html)) (body (charset UTF-8))
(disposition nil) (transfer-encoding 7BIT))
((partnum . 2) (type (IMAGE . x-xpixmap)) (body (name ladybug.xpm))
(disposition nil) (transfer-encoding BASE64))))
这里编辑是更多 IRL 示例:
(setq my-list haystack-list)
(setq my-needle (tree-assoc 'charset my-list))
(message "
-------------\n
- my-list: %s\n
- my-needle: %s\n
-------------\n" my-list my-needle)
生产:
my-list: ((TEXT plain (charset UTF-8) nil nil 7BIT 260 18 nil nil nil) (TEXT html (charset UTF-8) nil nil QUOTED-PRINTABLE 738 17 nil nil nil) 替代(边界 e89a8fb1f8061a6be404c70a24a0) nil nil)
我的针:无
另一方面:
(tree-assoc 'charset '((TEXT plain (charset UTF-8) nil nil 7BIT 260 18 nil nil nil)
(TEXT html (charset UTF-8) nil nil QUOTED-PRINTABLE 738 17 nil nil nil)
alternative (boundary e89a8fb1f8061a6be404c70a24a0) nil nil))
=>(charset UTF-8)
真的,我不知道这里发生了什么:有人可能会争论“这个干草堆列表是什么,它来自哪里?”但它是否相关?我正在制作这个 haystack-list 的副本(我的列表),那么是什么给出了这些不同的结果?列表的引用?伙计们,我真的迷路了
NB(这种行为(在直接评估中有效,但不适用于 defun/let 生产情况)在给出的所有解决方案中发生)
编辑:我最终提取了找到的第一个列表,然后从该列表中提取(而不是搜索)元素。我证明更快;当然此时你可以说“我的元素总是在找到的第一个列表中);感谢大家,通过这一切我学到了很多。
【问题讨论】:
-
生成这些列表的任何东西都应该生成字符串值而不是符号值。我怀疑您的部分问题源于那里,这将使进一步处理变得困难。
-
我猜你是对的,瓦廷。几乎这里给出的每个解决方案都适用于引用的列表示例,但在 let 上下文中中断(在“listp”测试中。就像整个想法不是要区分列表和原子......我迷路了)。问题是,这个列表是由一个大的(imap.el)生成的,我不想编辑它......
-
到目前为止,似乎我正在尝试做的事情(在“my-list”中搜索“something”,无论my-list到底是什么,只要它是一个语法正确的列表) 是不可能的。我不知道有些列表可能是“不适当的”......嗯。
标签: algorithm emacs lisp elisp