Lisp 在更新其中一个列表时循环浏览两个列表

Lisp 在更新其中一个列表时循环浏览两个列表,lisp,iteration,common-lisp,Lisp,Iteration,Common Lisp,我有两份清单如下: (x y z) & (2 1) 我想得到这样的结果: ((x y) (z)) 这些清单之间的关系非常清楚。基本上我想把第一个列表的成员重新排列成一个列表,第二个列表有两个长度。 我已尝试运行两次dotimes迭代来实现这一点: (let ((result) (list1* list1)) (dotimes (n (length list2) result) (progn (setq result (append

我有两份清单如下:

(x y z) & (2 1)
我想得到这样的结果:

((x y) (z))
这些清单之间的关系非常清楚。基本上我想把第一个列表的成员重新排列成一个列表,第二个列表有两个长度。 我已尝试运行两次dotimes迭代来实现这一点:

(let ((result) (list1* list1))
   (dotimes (n (length list2) result)
     (progn (setq result
                  (append result
                          (list (let ((result2))
                                  (dotimes (m (nth n list2) result2)
                                    (setq result2
                                         (append result2
                                                 (list (nth m list1*)))))))))
            (setq list1*
                 (subseq list1* 0 (nth n list2))))))
我的想法是,首先列出预期结果xy,然后我想更新xyz列表,以便删除xanyy,而我只有z。然后循环再次运行以获得预期结果中的z列表。这无法正常工作,并导致:

 ((x y) (x))

这显然意味着progn的第二个命令基本上是更新list1*不起作用。显然,必须有一个正确和更好的方法来做到这一点,我想知道是否有人可以帮助这一点。还要解释为什么不可能解释解决方案?

如果我看得没错,您的问题在subseq list1*0 nth n list2中,它返回列表中您不想要的部分

我有以下建议:

(defun partition-list (list lengths)
  (mapcar (lambda (length)
            (loop :repeat length
                  :collect (pop list)))
          lengths))

当然,这有点过于简单,因为它不会处理意外的输入,例如长度列表小于reduce'+长度,但它可以扩展。

如果我看得没错,您的问题在subseq list1*0 nth n list2中,它返回列表中您不想要的部分

我有以下建议:

(defun partition-list (list lengths)
  (mapcar (lambda (length)
            (loop :repeat length
                  :collect (pop list)))
          lengths))

当然,这有点过于简单,因为它不会处理意外的输入,例如长度列表小于reduce'+长度,但可以对其进行扩展。

仅为示例起见,另一种方法是使用iterate:


举个例子,另一种方法是使用iterate:


我认为iterate是一个库,使用这个包在易读性上确实是值得的。@Svante是的。我在发帖时这么做的原因是为了不让读者对它的来源感到困惑。对于那些使用SLIME的人来说,可能需要一段时间来确定他们需要执行哪些步骤才能使示例运行如果您不使用package并尝试评估假设您使用的代码,那么您将得到一般错误,这对你理解你必须做的事情没有多大帮助。我认为迭代是一个库,使用这个包在易读性上确实是值得的。@Svante是的。我在发帖时这么做的原因是为了不让读者对它的来源感到困惑。对于那些使用SLIME的人来说,可能需要一段时间来弄清楚他们需要执行哪些步骤才能让示例运行如果您不使用package并尝试评估假设您使用的代码,那么您将得到一般性错误,这对您理解必须执行的操作没有多大帮助。