কিভাবে দুটি তালিকা একত্রিত করতে?


15

দুঃখিত, তবে এলিসপ আমার সেরা নয়। আমার এইভাবে দুটি স্ট্রিংয়ের তালিকা একত্রিত করতে হবে:

("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"))
আইনজীবি

1
ওহ, হ্যাঁ, appendএখানে সত্যিই ভাল মনে হয়।
জিনপিয়েরে

nconc কাজ করে তবে, আপনি যদি ভেরিয়েবলের তালিকাগুলি সঞ্চয় করেন তবে সেগুলি এনকনসি দ্বারা সংশোধন করা হবে। উদাহরণস্বরূপ (আসুন ((একটি '(1 2 3)) (বি' (3 4 5%)) (এনকনসি আব) ক) পরিবর্তনশীলটি পরিবর্তন করবে।
জন কিচিন

1
অবগতির জন্য cl-concatenateব্যবহার appendযখন হল TYPE list, তাই উভয় উত্তর একই ফলাফল উৎপাদন করা হয়।
ফিলিপস

হ্যাঁ, এটি অবশ্যই কাজটি করে। আপনার সহায়তার জন্য প্রত্যেককে অনেক ধন্যবাদ।
ড্যানিয়েল

3

কনকেনেটেট হ'ল 'ক্লিচেল' -তে 'সিএল-কনকনেটেট' এর একটি নাম।

(এক প্রকারের টাইপ সিকোয়েন্স ...)

সংযুক্তি, টাইপ TYPE এর অনুক্রমের মধ্যে SEQUENCE টি যুক্তি।

সুতরাং আপনার উদাহরণের জন্য

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

যেহেতু এটি সংজ্ঞায়িত হয়েছে clআপনাকে (require 'cl)প্রথমে হতে পারে , অন্যথায় আপনি ব্যবহার করতে পারেন cl-concatenateযা ডিফল্টরূপে লোড হয়েছে বলে মনে হয়।

এছাড়াও, @ ফিলস দ্বারা উল্লিখিত হিসাবে যেমন টিওয়াইপিই হয় 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, @ জন কিচিন নির্দেশ করেছেন।

অবশেষে, @ লিওলিস্ট উল্লেখ করেছেন nconc:

এন সি সি সি 'সোর্স কোড' এর একটি অন্তর্নির্মিত ফাংশন।

(এনসিএনসি এবং বিশ্রামের তালিকা)

যে কোনও সংখ্যক তালিকাকে পরিবর্তন করে সংযুক্ত করুন। শুধুমাত্র শেষ যুক্তিটি পরিবর্তন করা হয় না, এবং তালিকা তৈরি করার দরকার নেই।

কি এই মানে:

(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")

ধন্যবাদ, তবে দেখে মনে হচ্ছে এটি যদি তৃতীয় এবং তৃতীয় আর্গুমেন্টটি ভেরিয়েবল হয় এবং সুস্পষ্ট তালিকাগুলি না হয় তবে এটি ত্রুটি দেখায় returns
ড্যানিয়েল

1
(setq l1 '("a" "b" "c") l2 '("d" "e" "f")) (concatenate 'list l1 l2)ঠিক আছে কাজ করে।
জিনপিয়ের 21

@ ড্যানিয়েল আমার সন্দেহ হয় আপনি ভেরিয়েবলগুলি উদ্ধৃত করার চেষ্টা করছেন , যার অর্থ তারা তাদের তালিকার মানগুলিতে মূল্যায়ন করেন নি। (অর্থাত্ আপনি varnameবরং চান 'varname)।
ফিল্ডস

সম্পূর্ণতার জন্য, আমি পাশাপাশি Emacs> = 25: seq-concatenate(পরে (require 'seq)) এ যে কোনও ধরণের ক্রমকে যুক্ত করে তোলার নন-সিএল উপায় উল্লেখ করতে পারি , যদিও এটি কেবল মোড়কে যায় cl-concatenate
তুলসী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.