如何在普通 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 有人请帮助我在这方面。非常感谢您的帮助。
您需要创建一个执行以下操作的过程:
- 参数为 () 时处理。通常结果是 ()
- 默认情况下,您处理一连串的两个。例如。
(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))
我是 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 有人请帮助我在这方面。非常感谢您的帮助。
您需要创建一个执行以下操作的过程:
- 参数为 () 时处理。通常结果是 ()
- 默认情况下,您处理一连串的两个。例如。
(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))