如何找到一个元素在球拍列表索引?(How do I find the index of an ele

2019-08-20 04:54发布

这是微不足道的,当然实现,但我觉得肯定是有内置于球拍做这个事情。 我是正确的直觉,如果有的话,是什么功能?

Answer 1:

奇怪的是,没有在球拍内置程序查找列表中的一个元素的基于0的索引(相反的过程确实存在,它被称为list-ref )。 然而,它并不难,以有效地实现:

(define (index-of lst ele)
  (let loop ((lst lst)
             (idx 0))
    (cond ((empty? lst) #f)
          ((equal? (first lst) ele) idx)
          (else (loop (rest lst) (add1 idx))))))

在相似的程序srfi/1 ,这就是所谓的list-index ,你可以通过传递正确的参数获得预期的效果:

(require srfi/1)

(list-index (curry equal? 3) '(1 2 3 4 5))
=> 2

(list-index (curry equal? 6) '(1 2 3 4 5))
=> #f

UPDATE

由于球拍6.7的, index-of现在是标准库的一部分。 请享用!



Answer 2:

这里是一个非常简单的实现:

(define (index-of l x)
  (for/or ([y l] [i (in-naturals)] #:when (equal? x y)) i))

是的,这样的事情应该被添加到标准库,但是这样做的人到了那里但它只是一个有点棘手。

但请注意,这是一个特点,那就是非常很少有用 - 因为列表通常被看作是只使用第一/休息成语,而不是直接访问元素解构的序列。 更重要的是,如果你有一个使用它,你是一个新手,那么我的第一个猜测将是你滥用名单。 鉴于此,加入这样的功能很可能将使其更容易跳闸这样的新手。 (但它仍然会增加,最终)。



Answer 3:

你也可以使用内置函数“ member ”,这给出了一个子表与所需的项目或开始#f如果项目没有在列表中存在。 继原进行比较列表,并通过会员返回的子表的长度:

(define (indexof n l)
  (define sl (member n l))
  (if sl 
      (- (length l)
         (length sl))
      #f))

在很多情况下,人们可能希望在列表项的所有出现的索引。 人们可以得到所有索引列表如下:

(define (indexes_of1 x l)
  (let loop ((l l)
             (ol '())
             (idx 0))
    (cond
      [(empty? l) (reverse ol)]
      [(equal? (first l) x)
       (loop (rest l)
             (cons idx ol)
             (add1 idx))]
      [else
       (loop (rest l)
             ol
             (add1 idx))])))

For/list也可以用于此:

(define (indexes_of2 x l)
  (for/list ((i l)
             (n (in-naturals))
             #:when (equal? i x))
    n))

测试:

(indexes_of1 'a '(a b c a d e a f g))
(indexes_of2 'a '(a b c a d e a f g))

输出:

'(0 3 6)
'(0 3 6)


文章来源: How do I find the index of an element in a list in Racket?