सूची में तत्व संख्या कैसे प्राप्त करें?


17

प्रश्न: मैं सूची में तत्व संख्या कैसे प्राप्त करूं?

nthसूची से तत्व नंबर n मिलता है:

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

मैं रिवर्स करना चाहता हूं: तत्व को दिए गए तत्व संख्या प्राप्त करें:

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

मैं इसे याद कर सकता हूं, लेकिन क्या ऐसा कोई फ़ंक्शन मौजूद है? कोई ऐसा कैसे करेगा?

जवाबों:


22
  1. यहाँ एक फ़ंक्शन है जो 24.3 और बाद में Emacs के साथ शामिल है:
(cl-position 2 '(6 7 8 2 3 4)) ;; => 3

(Emacs 24.3 से पहले, positionलाइब्रेरी से फ़ंक्शन का उपयोग करें cl.el, जो Emacs के साथ शामिल है।)

: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

यह Emacs के साथ शामिल नहीं है, लेकिन Emacs उपयोगकर्ताओं का एक बहुत पहले से ही यह स्थापित किया है (इसके बारे में एक निर्भरता है 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 संस्करणों के लिए भी अच्छा है। हालाँकि, इसमें यह व्यवहार भिन्नता है, जिसे आप चाहते हैं या नहीं भी कर सकते हैं: यह एक बिंदीदार सूची की कारों के लिए भी काम करता है। यही है, यह सही ढंग से एक त्रुटि को बढ़ाने के बजाय स्थिति देता है, जैसे कि सेक्सप्स के लिए (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

अगर कोई मौजूद है, तो मैं बिल्ट-इन समाधान पसंद करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.