如何在普通 lisp 中从一个奇数对和偶数对的单个列表创建列表列表

How to create list of lists from one single list with odd and even pair in common lisp

我是 Lisp 编程的新手,正在尝试从 lisp 中的一个列表创建子列表,其中一对奇数和偶数来自列表。例如: 我有一个清单

ListA ("a" "b" "c" "d" "e" "f" "g" "h") 

现在我想转换成下面的列表:

enter code here
ListB  ( ("a" "b") ("c" "d") ("e" "f") ("g" "h") )

所以总是会生成值为((第一秒)(三四)(五六)......)的子列表

我尝试了多种方法,例如首先取出奇数项和偶数项分开并使用函数 (list (oddlist evenlist)) 但没有得到上面的预期值 ListB.Could 有人请帮助我在这方面。非常感谢您的帮助。

您需要创建一个执行以下操作的过程:

  1. 参数为 () 时处理。通常结果是 ()
  2. 默认情况下,您处理一连串的两个。例如。 (cons (list "a" "b") recursive-call-here)

所以 '("g" "h") 的结果变成了 (cons (list "g" "h") ()) 如果你把它添加到 recursive-call-here backwards 你最终会得到:

(cons (list "a" "b") 
      (cons (list "c" "d") 
            (cons (list "e" "f") 
                  (cons (list "g" "h") ())))) 
; ==> (("a" "b") ("c" "d") ("e" "f") ("g" "h"))

如果您已经像您建议的那样将偶数元素与奇数元素分开,下一步将是:

(mapcar #'list evenlist oddlist)

evenlist 还是 oddlist 哪个先到,取决于你是从 0 还是 1 开始数。

或者,整个问题可以用一个 loop 表达式解决:

(loop for head = '(a b c d e f g h i j k l m n o p) then (cddr head)
   until (null head)
     if (= (length head) 1) collect head
     else collect (subseq head 0 2))

这实际上 非常循环:

(loop for (x y) on '(a b c d e f) by #'cddr
      collect (list x y))
;=> ((A B) (C D) (E F))

如果你有奇数个元素,这确实会给你最后一对 NIL,但你没有提到在这种情况下应该发生什么:

(loop for (x y) on '(a b c d e f g ) by #'cddr
      collect (list x y))
;=> ((A B) (C D) (E F) (G NIL))