如何将列表划分为随机长度的(子)列表?

时间:2018-11-16 09:44:21

标签: list emacs

例如,输入(4是最大长度):

(my-partition-randomly '(a b c d e f g h i j k l) 4)

输出:

'((a b c) (d) (e f g h) (i j k) (l))

该代码应在Emacs Lisp解释器中运行。

1 个答案:

答案 0 :(得分:2)

我的elisp-fu很弱,但是我能够编写以下函数:

(defun my-partition-randomly (list max-length) ""
       (let ((result '()))
         (while list
           (push (seq-take-while (lambda (x) x)
                                 (map 'list
                                      (lambda (x) (pop list))
                                      (number-sequence 1 (+ 1 (random max-length)))))
                 result))
         (reverse result)))

它提取输入列表的随机初始序列并将其添加到结果中(当最后一个子序列要比其余列表长时,seq-take-while不必包含nil)。 push在左侧添加了元素,因此结果必须颠倒。