以下Emacs Lisp函数获取列表列表并返回一个列表,其中内部列表的项目已连接到一个大列表.这很简单,我确信这样的东西必须已经成为标准函数库的一部分.
(defun flatten (LIST)
(if LIST
(append (car LIST) (flatten (cdr LIST)))
nil))
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个函数,它将单个列表列表作为其参数,然后附加所有内部列表.
(flatten '((a b) (c d)))
Run Code Online (Sandbox Code Playgroud)
会给
(a b c d)
Run Code Online (Sandbox Code Playgroud)
有谁知道这个功能是否已经内置,如果有的话,在哪个名称下?
谢谢!
Vat*_*ine 13
你要么寻找附加物:
(defun flatten (list-of-lists) (apply #'append list-of-lists))
如果(并且仅当)您知道您将始终拥有列表列表.
除此以外:
(defun flatten (list) (mapcan (lambda (x) (if (listp x) x nil)) list))
gsl*_*gsl 12
Emacs 27.1 有flatten-tree:
(flatten-tree '((a b) (c d)))
(a b c d)
Run Code Online (Sandbox Code Playgroud)
请参阅:https ://www.gnu.org/software/emacs/manual/html_node/elisp/Building-Lists.html
小智 7
我最近才进入这个阶段,同时寻找不同的东西; 根据原始问题是否意在引用通用列表(即:列表清单列表......)或者用于检查功能的测试数据,可能没有提供证据.只是两级列表(如示例中所示).
基于append此解决方案仅适用于两级列表,并且基于mapcan此解决方案存在进一步的问题.
基本上,一般解决方案必须在car和cdr上递归,如flatten下面的defun.
(setq l '((((1 2) 3) 4) (5 6 7)))
(defun flatten(x)
(cond ((null x) nil)
((listp x) (append (flatten (car x)) (flatten (cdr x))))
(t (list x))))
(defun flatten2(l)
(if l (append (car l) (flatten2 (cdr l))) nil))
(defun flatten3(l)
(mapcan (lambda(x) (if (listp x) x nil)) l))
(flatten l)
(1 2 3 4 5 6 7)
(apply #'append l)
(((1 2) 3) 4 5 6 7)
(flatten2 l)
(((1 2) 3) 4 5 6 7)
Run Code Online (Sandbox Code Playgroud)
进一步的问题是使用mapcanin flatten3:作为mapcan隐藏nconc内部,用户必须记住它改变其参数.
l
((((1 2) 3) 4) (5 6 7))
(flatten3 l)
(((1 2) 3) 4 5 6 7)
l
((((1 2) 3) 4 5 6 7) (5 6 7))
Run Code Online (Sandbox Code Playgroud)
Dash是Emacs的现代列表库,并且已变平。这是继magit之后在Melpa 上下载次数第二多的软件包。从自述文件:
-flatten (l):获取嵌套列表l,并将其内容作为单个平面列表返回。
(-flatten '((1))) ;; => '(1)
(-flatten '((1 (2 3) (((4 (5))))))) ;; => '(1 2 3 4 5)
(-flatten '(1 2 (3 . 4))) ;; => '(1 2 (3 . 4))
Run Code Online (Sandbox Code Playgroud)
-flatten-n (num list):展平num嵌套列表的级别。
(-flatten-n 1 '((1 2) ((3 4) ((5 6))))) ;; => '(1 2 (3 4) ((5 6)))
(-flatten-n 2 '((1 2) ((3 4) ((5 6))))) ;; => '(1 2 3 4 (5 6))
(-flatten-n 3 '((1 2) ((3 4) ((5 6))))) ;; => '(1 2 3 4 5 6)
Run Code Online (Sandbox Code Playgroud)
该软件包始于2012-09年。
| 归档时间: |
|
| 查看次数: |
3230 次 |
| 最近记录: |