목록에서 요소 번호를 얻는 방법?


16

Q : 리스트에서 요소 번호는 어떻게 얻습니까?

nth목록에서 요소 번호 n 을 가져 옵니다.

(nth 2 '(a b c d))                      ; => c

나는 반대로하고 싶다 : 요소가 주어진 요소 번호를 얻으십시오 :

(some-function 'c '(a b c d))           ; => 2

나는 그것을 놓쳤을 수도 있지만 그러한 기능이 존재합니까? 어떻게하면 될까요?

답변:


22
  1. Emacs 24.3 이상에 포함 된 기능은 다음과 같습니다.
(cl-position 2 '(6 7 8 2 3 4)) ;; => 3

(Emacs 24.3 이전에는 Emacs 에 포함 된 positionlibrary의 함수 를 사용하십시오 cl.el.)

:test키워드를 사용하여 비교 기능을 지정할 수 있습니다 .

(cl-position "bar" '("foo" "bar" "baz") :test 'equal) ;; => 1
(cl-position '(1 2) '((3) (5 6) (1 2) nil) :test 'equal) ;; => 2

이맥스 커먼 리스프 에뮬레이션 매뉴얼

  1. dash.el 이것을 할 수있는 기능이 있습니다 : -elem-index
(-elem-index 2 '(6 7 8 2 3 4)) ;; => 3
(-elem-index "bar" '("foo" "bar" "baz")) ;; => 1
(-elem-index '(1 2) '((3) (5 6) (1 2) nil)) ;; => 2

그것은 이맥스에 포함되어 있지만, 이맥스 많은 사용자가 이미 설치되어있는 것 (그것은의 종속성의 projectile, flycheck그리고 smartparens그것을 적용 범위의 톤을 제공하는).


6

글쎄,을 사용하는 대신 자신의 롤을 원 cl-position하고을 사용하여 두 번 횡단하고 싶지 않은 경우 ( length)

(defun nth-elt (element xs)
  "Return zero-indexed position of ELEMENT in list XS, or nil if absent."
  (let ((idx  0))
    (catch 'nth-elt
      (dolist (x  xs)
        (when (equal element x) (throw 'nth-elt idx))
        (setq idx  (1+ idx)))
      nil)))

구 Emacs 버전에도 좋습니다. 그러나이 동작 차이는 사용자가 원하거나 원하지 않을 수도 있습니다. 점으로 구분 된 자동차에도 적용됩니다. 즉,과 같은 sexps의 경우 오류를 발생시키는 대신 위치를 올바르게 반환합니다 (nth-elt 'c '(a b c . d)).

부적합한 목록에 대해 항상 오류를 발생 시키려면 해당 목록을 항상 확인해야합니다.이 경우 항상 목록 끝으로 순회해야합니다.

(defun nth-elt (element xs)
  "Return zero-indexed position of ELEMENT in list XS, or nil if absent."
  (let ((idx  0))
    (when (atom (cdr (last xs))) (error "Not a proper list"))
    (catch 'nth-elt
      (dolist (x  xs)
        (when (equal element x) (throw 'nth-elt idx))
        (setq idx  (1+ idx)))
      nil)))

2

그것이 효율적이지 않을 수도 있지만 작성하는 간단한 기능이라는 것이 밝혀졌습니다.

(defun nth-elt (elt list)
  "Return element number of ELT in LIST."
  (let ((loc (length (member elt list))))
    (unless (zerop loc)
      (- (length list) loc))))

(nth-elt 'c '(a b c d))                 ; => 2
(nth-elt 'f '(a b c d))                 ; => nil

물론 내장 솔루션이 있다면 선호합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.