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