दो सूचियों को कैसे सम्‍मिलित करें?


15

क्षमा करें, लेकिन elisp मेरा सबसे अच्छा नहीं है। मुझे इस तरह से तार की दो सूचियों को संयोजित करने की आवश्यकता है:

("a" "b" "c") + ("d" "e" "f") -> ("a" "b" "c" "d" "e" "f")

खैर, आदेश महत्वपूर्ण नहीं है, इसलिए मैंने यह कोड लिखा है:

(while lista
  (add-to-list 'listb (car lista)) 
  (setq lista (cdr lista)))

यह काम करता है, लेकिन मैं सोच रहा हूं कि क्या कोई फ़ंक्शन है जो पहले से ही ऐसा करता है।

कोई सुराग? अग्रिम में धन्यवाद।


4
नोड मैनुअल की लिस्ट को देखें ।
ड्रयू

2
appendयहाँ सही उत्तर है, लेकिन ऐसा करने का एक और (विनाशकारी) तरीका होगा (setcdr (last a) b)
सीन एलेड

1
सूचियों पर काम कर रहे हैं? पानी का छींटा(-concat '(1) '(2 3) '(4)) ;; => '(1 2 3 4)
एहविंस

add-to-listलिस्प कोड में कभी भी इसका उपयोग न करें (यह डॉकस्ट्रिंग में यह कहता है)। इसके बजाय, उपयोग करें push
रेडॉन रोसबोरो

जवाबों:


25

आप सिर्फ एपेंड का भी इस्तेमाल कर सकते हैं।

(append '("a" "b" "c") '("d" "e" "f"))

2
और,(nconc '("a" "b" "c") '("d" "e" "f"))
17'17

1
ओह, हाँ, वास्तव में appendयहाँ बेहतर लगता है।
जीनपियर

nconc काम करता है लेकिन, यदि आप सूचियों को चर में संग्रहीत करते हैं, तो उन्हें nconc द्वारा संशोधित किया जाएगा। जैसे (let ((a (1 2 3)) (b '(3 4 5)) (nconc ab) a) वेरिएबल को संशोधित करेगा।
जॉन किचिन

1
TYPE के होने पर FYI cl-concatenateका उपयोग appendहोता है list, इसलिए दोनों उत्तर समान परिणाम दे रहे हैं।
फिल्स

हाँ, यह निश्चित रूप से काम करता है। आपकी मदद के लिए सभी को बहुत धन्यवाद।
डेनियल

3

concatenate 'cl -el' में 'cl-concatenate' के लिए एक उपनाम है।

(संक्षिप्त नाम टाइप करें ...)

टाइप टाइप के एक क्रम में कॉनकैटनेट, तर्क SEQUENCEs।

तो आपके उदाहरण के लिए

(concatenate 'list '("a" "b" "c") '("d" "e" "f"))

चूँकि यह clआपको (require 'cl)पहले परिभाषित करना पड़ सकता है , अन्यथा आप इसका उपयोग कर सकते हैं cl-concatenateजो लगता है कि डिफ़ॉल्ट रूप से भरा हुआ है।

इसके अलावा, जैसा @phils द्वारा बताया cl-concatenateसिर्फ कॉल appendजब प्रकार है 'list, यहाँ से स्रोत है cl-extra.el:

(defun cl-concatenate (type &rest sequences)
  "Concatenate, into a sequence of type TYPE, the argument SEQUENCEs.
\n(fn TYPE SEQUENCE...)"
  (pcase type
    (`vector (apply #'vconcat sequences))
    (`string (apply #'concat sequences))
    (`list (apply #'append (append sequences '(nil))))
    (_ (error "Not a sequence type name: %S" type))))

तो अगर आप केवल सूचियों का उपयोग कर रहे हैं, तो यह सीधे उपयोग करने के लिए सरल है append, जैसा कि @ जॉन किचिन ने बताया है।

अंत में, @lawlist का उल्लेख किया गया nconc:

nconc 'C source code' में एक अंतर्निहित फ़ंक्शन है।

(nconc और बाकी LISTS)

किसी भी सूची में फेरबदल करके उसे क्रमबद्ध करें। केवल अंतिम तर्क को बदला नहीं जाता है, और सूची की आवश्यकता नहीं है।

इसका क्या मतलब है:

(nconc '("a" "b" "c") '("d" "e" "f"))
=> ("a" "b" "c" "d" "e" "f")

(setq l1 '("a" "b" "c")
      l2 '("d" "e" "f"))
(nconc l1 l2)
=> ("a" "b" "c" "d" "e" "f")
l1
=> ("a" "b" "c" "d" "e" "f")
l2
=> ("d" "e" "f")

धन्यवाद, लेकिन ऐसा लगता है कि यह एक त्रुटि देता है यदि 2 और 3 तर्क चर हैं और स्पष्ट सूचियां नहीं हैं।
डेनियल

1
(setq l1 '("a" "b" "c") l2 '("d" "e" "f")) (concatenate 'list l1 l2)ठीक काम करता है
जीनपियर

@ डैनियल मुझे संदेह है कि आप चर को उद्धृत करने की कोशिश कर रहे थे , जिसका अर्थ है कि उनका मूल्यांकन उनके सूची मूल्यों के लिए नहीं किया गया है। (यानी आप varnameइसके बजाय चाहते हैं 'varname)।
फिल्स

पूर्णता के लिए, मैं Emacs> = 25: seq-concatenate(बाद (require 'seq)) में किसी भी प्रकार के अनुक्रम को बदलने के गैर-सीएल तरीके का उल्लेख कर सकता हूं , हालांकि यह बदले में सिर्फ लपेटता है cl-concatenate
तुलसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.