নেস্টেড এসোসিয়েশন-তালিকাগুলিতে মানগুলি পুনরুদ্ধার করার সর্বোত্তম উপায়?


11

ধরুন আমি এর মতো একটি এসোসিয়েট-তালিকা পেয়েছি:

(setq x '((foo . ((bar . "llama")
                  (baz . "monkey")))))

এবং আমি মান চাই bar। আমি এটা করতে পারবো:

(assoc-default 'bar (assoc-default 'foo x))

তবে আমি যা চাই তা হ'ল এমন কিছু যা একাধিক কী গ্রহণ করে, যেমন

(assoc-multi-key 'foo 'bar x)

এই জাতীয় জিনিসটি কি সম্ভবত কোথাও প্যাকেজে রয়েছে? আমি নিশ্চিত যে আমি এটি লিখতে পেরেছি তবে আমার গুগল-ফু কেবল ব্যর্থ হচ্ছে এবং আমি এটি খুঁজে পাচ্ছি না বলে মনে হচ্ছে।


FWIW, আমি এই পৃষ্ঠায় কোনও নেস্টেড তালিকা দেখতে পাচ্ছি না। আমি কেবল সাধারণ, অকেজো তালিকাভুক্ত দেখি। এবং আপনি কী আচরণের সন্ধান করছেন তা পরিষ্কার নয়। আপনি আচরণ সম্পর্কে কিছুই বলেন নাassoc-multi-key । সম্ভবত এটি তার প্রথম দুটি যুক্তির উভয়ের সাথেই ম্যাচগুলির সন্ধান করে তবে আপনি যা বলেছিলেন তা থেকে সত্যই এটাই মনে করা যায় one এবং এটি স্পষ্টত দুটি টির বেশি চাবি গ্রহণ করতে পারে না, কারণ অ্যালিস্ট আর্গুমেন্ট (সম্ভবতঃ x) প্রথমটি নয়, প্রথমটি - যা প্রস্তাব দেয় যে এটি সাধারণভাবে খুব বেশি কার্যকর নয়। আপনি যা খুঁজছেন তা উল্লেখ করার চেষ্টা করুন ।
ড্রিউ

আমি setqবিভ্রান্তিকর উদাহরণেও ফর্মটির মূল ফর্ম্যাটিংটি পেয়েছি , তাই আমি এটি সম্পাদনা করে এসোস-তালিকাগুলির জন্য সাধারণ ডট-নোটেশনটি ব্যবহার করতে।
পেপ্রিকা

আহ, ঠিক আছে. সুতরাং অ্যালিস্টের দুটি স্তর রয়েছে। প্রশ্নটি এখনও অস্পষ্ট - assoc-multi-keyঅনির্ধারিত থেকে যায়।
ড্র হয়েছে

1
ড্রু: দ্য পয়েন্টটি assoc-multi-keyহ'ল এসোস-তালিকার প্রথম কীটি সন্ধান করা। এটি এমন একটি নতুন এসোসিয়েশন-তালিকার সমাধান করতে হবে যেখানে আমরা পরবর্তী কীটি সন্ধান করব। এবং তাই এগিয়ে। নেস্টেড এসোসিয়েশন-তালিকার বাইরে মানগুলি খননের জন্য মূলত একটি শর্ট হ্যান্ড।
অবিংহাম

2
@ মালবারবা সম্ভবত let-alistআপনিও উল্লেখ করতে পারেন? যেমন (let-alist '((foo . ((bar . "llama") (baz . "monkey")))) .foo.bar)ফিরে আসবে "llama"। আমার ধারণা আপনি let-alistপ্রশ্নটি জিজ্ঞাসা করার পরে লিখেছিলেন , তবে এটি প্রশ্নের উদ্বেগ এবং আইএমওর উল্লেখ করার পক্ষে খুব মূল্যবান!
ইয়ংফ্রোগ

উত্তর:


15

এখানে এমন একটি বিকল্প রয়েছে যা আপনি যা চেয়েছিলেন ঠিক সিনট্যাক্সটি নিয়েছেন তবে সাধারণ পদ্ধতিতে এবং এটি বোঝার পক্ষে সহজ। পার্থক্যটি হ'ল একমাত্র পার্থক্যটি হ'ল ALIST(এটি যদি আপনার কাছে গুরুত্বপূর্ণ হয় তবে আপনি এটি শেষের দিকে রূপান্তর করতে পারেন)।

(defun assoc-recursive (alist &rest keys)
  "Recursively find KEYs in ALIST."
  (while keys
    (setq alist (cdr (assoc (pop keys) alist))))
  alist)

তারপরে আপনি এটিকে কল করতে পারেন:

(assoc-recursive x 'foo 'bar)

2
এটি আমি রান্নাও করেছি কমবেশি। আমি কিছুটা অবাক হয়েছি যে এটি কোনও প্রতিষ্ঠিত গ্রন্থাগারের অংশ নয় যেমন ড্যাশ বা কিছু। যেমন json ডেটা নিয়ে কাজ করার সময় মনে হয় এটি সমস্ত সময় আসে।
অবিংহাম

2

এখানে আরও জেনেরিক সমাধান:

(defun assoc-multi-key (path nested-alist)
   "Find element in nested alist by path."
   (if (equal nested-alist nil)
       (error "cannot lookup in empty list"))
   (let ((key (car path))
         (remainder (cdr path)))
     (if (equal remainder nil)
         (assoc key nested-alist)
       (assoc-multi-key remainder (assoc key nested-alist)))))

এটি কীগুলির কোনও "পথ" নিতে পারে। এই ফিরে আসবে(bar . "llama")

(assoc-multi-key '(foo bar)
    '((foo (bar . "llama") (baz . "monkey"))))

যদিও এটি ফিরে আসবে (baz . "monkey"):

(assoc-multi-key '(foo bar baz)
    '((foo (bar (bozo . "llama") (baz . "monkey")))))

3
এই উত্তরের জন্য আমার প্রথম ডাউনটি পেয়েছি। কেউ আমাকে বলতে ইচ্ছুক কেন?
রেকাডো

1
আপনার কোড (+1) কাজ করার কারণে ডাউনভোটের সাথে আমি একমত নই। আমার জল্পনাটি হ'ল @ মালবারবা এর উত্তর অফারে থাকা অন্যান্য উত্তরের তুলনায় স্পষ্টতই বেশি সাধারণ / মার্জিত, এবং অন্য উত্তরগুলি কাজ করে না বলে নয়, তবে তারা সেরা না বলেই ডাউনভোট পেয়েছে। (এটি বলা হচ্ছে, আমি "সর্বোত্তমকে উন্নীত করুন এবং অন্যকে বিকল্পকে নিম্নমান দিন" বিকল্পের চেয়ে "সেরা উত্সাহিত করুন" বিকল্পটি পছন্দ করি))
ড্যান

1
এই দুটি প্রশ্নকে নাকচ করে দেওয়া হয়েছিল কারণ এখানে একজন ব্যক্তি রয়েছেন যা ডাউনভোটস কীভাবে কাজ করে তা পুরোপুরি বুঝতে পারে না (এবং কোনও মন্তব্য দেওয়ার জন্য ইন্টারফেসের অনুরোধকে অগ্রাহ্য করা পছন্দ করে)। এটি দুর্ভাগ্যজনক, তবে আমরা সবাই যেটা করতে পারি তা হ'ল উত্তোলন।
মালবারবা

0

এখানে একটি সাধারণ ফাংশন যা অন্য আলিস্টের অভ্যন্তরে একটি তালিকার সাথে কাজ করে:

(defun assoc2 (outer inner alist)
  "`assoc', but for an assoc list inside an assoc list."
  (assoc inner (assoc outer alist)))

(setq alist2 '((puppies (tail . "waggly") (ears . "floppy"))
               (kitties (paws . "fuzzy")  (coat . "sleek"))))

(assoc2 'kitties 'coat alist2)       ;; => (coat . "sleek")
(cdr (assoc2 'kitties 'coat alist2)) ;; => "sleek"

3
দয়া করে লোকেরা, আপনি যখন ভোট নেবেন, একটি মন্তব্য দিন।
মালবারবা

1
যে কমেছে: আমি ক্ষুব্ধ নই, তবে কেন কৌতূহল বোধ করি। @ মালবারা: "ডাউনভোট + মন্তব্য" এর মানদণ্ডে এখন একটি মেটা থ্রেড রয়েছে ? ; আমি আপনার গ্রহণ সম্পর্কে কৌতূহলী হতে হবে।
ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.