如何采取方案列表(子表)的一个切片?(How do I take a slice of a list

2019-06-24 23:29发布

给定一个列表,我怎么会选择一个新的列表,包含原始列表的片段(定偏移量和元素的数量)?

编辑:

好的建议为止。 是不是有在SRFI的一个规定的东西吗? 这似乎是一个非常基本的东西,所以我很惊讶,我要实现它在用户空间。

Answer 1:

下面的代码会做你想要什么:

(define get-n-items
    (lambda (lst num)
        (if (> num 0)
            (cons (car lst) (get-n-items (cdr lst) (- num 1)))
            '()))) ;'

(define slice
    (lambda (lst start count)
        (if (> start 1)
            (slice (cdr lst) (- start 1) count)
            (get-n-items lst count))))

例:

> (define l '(2 3 4 5 6 7 8 9)) ;'
()
> l
(2 3 4 5 6 7 8 9)
> (slice l 2 4)
(3 4 5 6)
> 


Answer 2:

奇怪的是, slice不具备SRFI-1 ,但你可以把它缩短了使用SRFI-1的takedrop

(define (slice l offset n)
  (take (drop l offset) n))

我以为我已经计划使用的扩展之一,如PLT方案库或诈骗,就会有这样的内置,但它似乎并不如此。 它甚至在新R6RS库中定义。



Answer 3:

你可以试试这个功能:

SUBSEQ 顺序起动&可选的结束

开始参数为您所抵消。 结束参数可以通过简单地增加开始+数的元素可以容易地转变成元件的数目,以抓住。

一个小的好处是,SUBSEQ适用于所有的序列,这不仅包括列表,而且字符串和载体。

编辑:这似乎并不是所有的Lisp实现都SUBSEQ,虽然它会做的工作就好了,如果你拥有它。



Answer 4:

(define (sublist list start number)
  (cond ((> start 0) (sublist (cdr list) (- start 1) number))
        ((> number 0) (cons (car list)
                      (sublist (cdr list) 0 (- number 1))))
        (else '())))


Answer 5:

下面是我实现slice使用适当的尾部调用

(define (slice a b xs (ys null))
  (cond ((> a 0) (slice (- a 1) b (cdr xs) ys))
        ((> b 0) (slice a (- b 1) (cdr xs) (cons (car xs) ys)))
        (else (reverse ys))))

(slice 0 3 '(A B C D E F G)) ;=> '(A B C)
(slice 2 4 '(A B C D E F G)) ;=> '(C D E F)


Answer 6:

尝试是这样的:

    (define (slice l offset length)
      (if (null? l)
        l
        (if (> offset 0)
            (slice (cdr l) (- offset 1) length)
            (if (> length 0)
                (cons (car l) (slice (cdr l) 0 (- length 1)))
                '()))))


文章来源: How do I take a slice of a list (A sublist) in scheme?
标签: lisp scheme