在列表中查找元素的索引

时间:2012-11-26 09:46:31

标签: list scheme element

我需要在方案中获取列表中的元素索引。例如:

  
    

(...... 2'(2 3 4 5))

         

0

         

(...... 4'(2 3 4 5))

         

2

  

有人可以帮忙吗?

7 个答案:

答案 0 :(得分:9)

像这样的东西

(define list-index
        (lambda (e lst)
                (if (null? lst)
                        -1
                        (if (eq? (car lst) e)
                                0
                                (if (= (list-index e (cdr lst)) -1) 
                                        -1
                                        (+ 1 (list-index e (cdr lst))))))))

答案 1 :(得分:6)

以下是我能提出的最清晰的解决方案:

(define (get-list-index l el)
    (if (null? l)
        -1
        (if (= (car l) el)
            0
            (let ((result (get-list-index (cdr l) el)))
                (if (= result -1)
                    -1
                    (1+ result))))))

这个解决方案与merriav大致相同,只是我在最后添加了一个let,这样就不会不必要地重复递归调用(在书面代码或执行中)。

接受的解决方案似乎没有考虑空列表或不包含所追索元素的列表。

答案 2 :(得分:3)

您可以使用反向成员长度 cdr index >如下:

(define (index a b)
  (let [(tail (member a (reverse b)))]
    (and tail (length (cdr tail))))

答案 3 :(得分:0)

我的最终解决方案:

(define index
  (lambda (cislo l)
    (if (equal? (car l) cislo) 0 (+ 1 (index cislo (cdr l))))))
(define map-index-pred
  (lambda (pred? f l)
     (foldr (lambda (x y)
       (if (pred? (index x l))
         (cons (f x) y) (cons x y))) '() l)))

答案 4 :(得分:0)

答案比你们预期的要容易,也没有递归:)

简单的功能,以防您确定元素在列表中

(define element-index
  (lambda (elemento lista)
    (- (length lista) (length (memv elemento lista)))))

如果考虑元素可能不在列表中的情况。如果找不到则返回false

(define element-index
  (lambda (elemento lista)
    (if (eqv? (list? (memv elemento lista)) #t)
        (- (length lista) (length (memv elemento lista)))
        false
        )
    ))

最终结果:

> (element-index 2 '(2 3 4 5))
0
> (element-index 4 '(2 3 4 5))
2
> (element-index 6 '(2 3 4 5))
false

答案 5 :(得分:0)

以下代码实现了目标:

def create
  @post = Post.find(params[:id])
  @post_comment = @post.post_comments.build(post_comment_params)
  @post_comment.save!
end

答案 6 :(得分:0)

如果您不需要担心该元素不在列表中的情况,则以下代码可能是最短版本。 (如果元素不在列表中,则会发生异常。)

(define (element-index e lst)
    (cond [(eqv? e (car lst)) 0]
          [else (+ (element-index e (cdr lst)) 1)])))

否则,请使用以下代码:

(define element-index
  (letrec
    ([element-index-helper
       (lambda (e lst index)
         (cond [(null? lst) #f]
               [(eqv? e (car lst)) index]
               [else (element-index-helper e (cdr lst) (+ index 1))]))])
    (lambda (e lst)
      (element-index-helper e lst 0))))

示例:

> (element-index 'a '(a b c))
0
> (element-index 'b '(a b c))
1
> (element-index 'c '(a b c))
2
> (element-index 'd '(a b c))
#f