以下Emacs Lisp函数获取列表列表并返回一个列表,其中内部列表的项目已连接到一个大列表.这很简单,我确信这样的东西必须已经成为标准函数库的一部分.
(defun flatten (LIST) (if LIST (append (car LIST) (flatten (cdr LIST))) nil))
我正在寻找一个函数,它将单个列表列表作为其参数,然后附加所有内部列表.
(flatten '((a b) (c d)))
会给
(a b c d)
有谁知道这个功能是否已经内置,如果有的话,在哪个名称下?
谢谢!
你要么寻找附加物:
(defun flatten (list-of-lists) (apply #'append list-of-lists))
如果(并且仅当)您知道您将始终拥有列表列表.
除此以外:
(defun flatten (list) (mapcan (lambda (x) (if (listp x) x nil)) list))
我最近才进入这个阶段,同时寻找不同的东西; 根据原始问题是否意在引用通用列表(即:列表清单列表......)或者用于检查功能的测试数据,可能没有提供证据.只是两级列表(如示例中所示).
基于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)
进一步的问题是使用mapcan
in 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))
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))
-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)
该软件包始于2012-09年。