কিভাবে একটি তালিকায় উপাদান নম্বর পেতে?


16

প্রশ্ন: আমি কীভাবে একটি তালিকায় উপাদান নম্বর পেতে পারি?

nthএকটি তালিকা থেকে উপাদান সংখ্যা এন পায় :

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

আমি বিপরীতটি করতে চাই: উপাদানটি দিয়ে মৌলিক সংখ্যাটি পান:

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

আমি এটি মিস করেছি, তবে এরকম কোনও ফাংশন কি বিদ্যমান? কেউ কিভাবে এটি করবে?

উত্তর:


22
  1. এখানে একটি ফাংশন যা ইমাস 24.3 এবং এর পরে অন্তর্ভুক্ত রয়েছে:
(cl-position 2 '(6 7 8 2 3 4)) ;; => 3

(ইমাস 24.3 এর আগে, positionলাইব্রেরি থেকে ফাংশন ব্যবহার করুন 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

এটা তোলে গিয়ে 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)))

এটি পুরানো ইমাস সংস্করণগুলির জন্যও ভাল। তবে, এর আচরণগত পার্থক্য রয়েছে, যা আপনি হয়ত বা না চাইতে পারেন: এটি একটি বিন্দুযুক্ত তালিকার গাড়িগুলির জন্যও কাজ করে। এটি, যেমন যৌনতার জন্য ত্রুটি বাড়ানোর পরিবর্তে সঠিকভাবে অবস্থানটি ফিরিয়ে দেয় (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.