【问题标题】:How to create list of lists from one single list with odd and even pair in common lisp如何从一个列表中创建列表列表,在普通 lisp 中使用奇偶对
【发布时间】:2015-06-01 14:58:09
【问题描述】:

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

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

现在我想转换成以下列表:

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

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

我尝试了多种方法,例如首先取出奇数项和偶数项分开并使用函数(列表(oddlist evenlist))但没有超过上述ListB中的预期值。有人可以在这方面帮助我吗.非常感谢您的帮助。

【问题讨论】:

  • 对于一个包含奇数个元素的列表,结果应该是什么?
  • 我一般不会指出错别字,但请注意语言是“Common Lisp”,而不是“Comman Lisp”,或者(如your earlier question)“Conman Lisp”。 (虽然那里可能有一些骗子 Lispers。)

标签: lisp common-lisp


【解决方案1】:

这实际上是非常loop

(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))

【讨论】:

  • 非常感谢约书亚!完美地工作。非常抱歉打错了
【解决方案2】:

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

(mapcar #'list evenlist oddlist)

evenlistoddlist 哪个先出现,取决于您是从 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 用法。你可以(loop for (x y) on '(a b c d e f) by #'cddr collect (list x y)),就像我在another answer中展示的那样。
  • @JoshuaTaylor 谢谢,我不知道loop 能做到这一点。我已经更正了我在 PLaneT 上对 loop 宏的 Racket 实现,因此它也可以在那里工作。
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2017-03-30
    相关资源
    最近更新 更多