Emacs lisp में दो सेट के बीच अंतर की गणना कैसे करें, सेट सूची होना चाहिए




elisp set (3)

Emacs Lisp में दो सेट के बीच अंतर की गणना कैसे करें? सेट सूची होना चाहिए। प्रोग्राम बहुत सरल और छोटा होना चाहिए, अन्यथा मैं इसे समझ नहीं पाता। मैं एक नौसिखिया हूँ

धन्यवाद


अस्वीकरण: यह ईलिस में ऐसा करने का एक कारगर तरीका नहीं है। एक हैश फ़ंक्शन के साथ एक हैश-तालिका के माध्यम से एक प्रभावी तरीका है, लेकिन जब आप सूचियों के बारे में पूछा, तो यहां यह है:

(defun custom-set-difference (a b)
  (remove-if
     #'(lambda (x) (and (member x a) (member x b)))
     (append a b)))

(custom-set-difference '(1 2 3 4 5) '(2 4 6))

(1 3 5 6)

(defun another-set-difference (a b)
  (if (null a) b
    (let (removed)
      (labels ((find-and-remove
                (c)
                (cond
                 ((null c) nil)
                 ((equal (car c) (car a))
                  (setq removed t) (cdr c))
                 (t (cons (car c) (find-and-remove (cdr c)))))))
        (setf b (find-and-remove b))
        (if removed
            (another-set-difference (cdr a) b)
          (cons (car a) (another-set-difference (cdr a) b)))))))

(another-set-difference '(1 2 3 4 5) '(2 4 6))

(1 3 5 6)

दूसरा थोड़ा और अधिक कुशल है, क्योंकि यह तत्वों को निकाल देगा क्योंकि यह फलस्वरूप जांच करता है, लेकिन पहले कम और अधिक सीधे-आगे है।

यह भी ध्यान रखें कि सूचियों को सेट का अच्छा प्रतिनिधित्व नहीं है क्योंकि वे पुनरावृत्ति की अनुमति देते हैं। हैश नक्शे उस प्रयोजन के लिए बेहतर हैं


सामान्य लिस्प एक्सटेंशन में एक set-difference फंक्शन फ़ंक्शन होता है:

elisp> (require 'cl)
cl
elisp> (set-difference '(1 2 3) '(2 3 4))
(1)

जब मैं एलिसिप कोड लिखता हूं जिसमें बहुत सारे डेटा डेटा परिवर्तन होता है, तो मैं dash लाइब्रेरी का उपयोग करता हूं, क्योंकि इसमें सूचियों के साथ काम करने के लिए फ़ंक्शन का भार है सेट अंतर के साथ किया जा सकता है अंतर:

(-difference '(1 2 3 4) '(3 4 5 6)) ;; => '(1 2)