2009-06-09 9 views
11

निम्नलिखित Emacs Lisp फ़ंक्शन सूचियों की एक सूची लेता है और एक सूची देता है जिसमें आंतरिक सूचियों की वस्तुओं को एक बड़ी सूची में जोड़ा गया है। यह बहुत सीधी आगे है और मुझे कुछ आश्वस्त है जैसे कि यह पहले से ही मानक फ़ंक्शन लाइब्रेरी का हिस्सा होना चाहिए।बिल्ट-इन Emacs Lisp लाइब्रेरी में इस फ़ंक्शन का नाम?

(defun flatten (LIST) 
    (if LIST 
     (append (car LIST) (flatten (cdr LIST))) 
    nil)) 

मैं ऐसे फ़ंक्शन की तलाश में हूं जो सूचियों की एक सूची को इसके तर्क के रूप में ले लेगा और फिर सभी आंतरिक सूचियों को जोड़ देगा।

(flatten '((a b) (c d))) 

दे देंगे

(a b c d) 

किसी को भी इस समारोह में पहले से ही में बनाया गया है कि क्या पता है, और यदि हां, जो नाम के तहत?

धन्यवाद!

उत्तर

8

आप या तो संलग्न की तलाश कर रहे:

 
(defun flatten (list-of-lists) 
    (apply #'append list-of-lists)) 

हैं (और केवल यदि) क्या आप जानते हैं कि आप हमेशा सूचियों की एक सूची होगा।

अन्यथा:

 
(defun flatten (list) 
    (mapcan (lambda (x) (if (listp x) x nil)) list)) 
+1

आपके उत्तर, बहुत ही सुरुचिपूर्ण परिभाषाओं के लिए बहुत बहुत धन्यवाद। लेकिन वैसे भी, मेरा प्रश्न इस व्यवहार को प्राप्त करने के लिए बहुत कुछ नहीं था, लेकिन क्या एलिस्प पहले से ही ऐसा कार्य प्रदान करता है। यह जिज्ञासा से वास्तव में अधिक है, न कि क्योंकि मुझे एक विशिष्ट समस्या का सामना करना पड़ रहा है जो बहुत जटिल लगता है ... –

+3

उत्तर है, "हां, यह करता है", अर्थात् पहचान समारोह पर मैपकेन। – jrockway

+1

मुझे ऐसा नहीं लगता: मैपकेन दो तर्क (पहचान समारोह और एक सूची) लेता है जबकि संदिग्ध "flatten" केवल एक सूची लेता है। (जब आपको उसकी ज़रूरत होती है तो करी कहां है?) वैसे भी, जैसा कि मैंने पहले कहा था, यह वास्तव में महत्वपूर्ण नहीं है, और उपरोक्त वैटिन के समाधान दोनों महान हैं। –

0

nconc

+0

'nconc' विनाशकारी है। –

+0

हाँ, यह वही है जो मैं ढूंढ रहा था। केवल अंतर यह है कि पैरामीटर के रूप में सूचियों की सूची लेने के बजाय, nconc सूचियों की एक चर संख्या लेता है जो तब flattens। लेकिन मुझे लगता है कि यह काफी अच्छा है, हालांकि गैरेथ ने बताया कि, किसी को पता होना चाहिए कि नॉनकॉन विनाशकारी है। – Thomas

6

मैं जबकि कुछ अलग की तलाश में हाल ही में इस में कदम रखा पर एक नज़र डालें; ऐसा कुछ ऐसा है जो फ़ंक्शन को जांचने के लिए उपयोग किए गए परीक्षण डेटा द्वारा साक्ष्य में नहीं रखा गया हो सकता है, इस पर निर्भर करता है कि मूल प्रश्न सामान्य सूचियों (यानी: सूची की सूची की सूची की सूची ...) या संदर्भ के संदर्भ में था या नहीं। बस दो-स्तर की सूचियों के लिए (उदाहरण के रूप में)।

solution based on append केवल दो स्तर सूचियों के साथ ठीक काम करता है, और वहाँ solution based on mapcan साथ एक और मुद्दा है।

असल में, सामान्य समाधान, कार और सीडीआर पर दोनों पुनरावर्ती होने के लिए नीचे दिए गए flatten defun में के रूप में है।

(setq l '((((1 2) 3) 4) (5 6 7))) 

(defun flatten(x) 
    (cond ((null x) nil) 
    ((listp x) (append (flatten (car x)) (flatten (cdr x)))) 
    (t (list x)))) 

(defun flatten2(l) 
    (if l (append (car l) (flatten2 (cdr l))) nil)) 

(defun flatten3(l) 
    (mapcan (lambda(x) (if (listp x) x nil)) l)) 

(flatten l) 
(1 2 3 4 5 6 7) 

(apply #'append l) 
(((1 2) 3) 4 5 6 7) 

(flatten2 l) 
(((1 2) 3) 4 5 6 7) 

और मुद्दा flatten3 में mapcan के उपयोग के साथ है: के रूप में mapcan छुपाता एक nconc अंदर, उपयोगकर्ता याद रखना चाहिए कि यह अपने तर्क बदल देता है।

l 
((((1 2) 3) 4) (5 6 7)) 

(flatten3 l) 
(((1 2) 3) 4 5 6 7) 

l 
((((1 2) 3) 4 5 6 7) (5 6 7)) 
+0

बहुत अच्छी प्रतिक्रिया, धन्यवाद। – re5et

2

मुझे एहसास है कि मूल प्रश्न "निर्मित कार्य क्या है"। ऐसा लगता है कि कोई नहीं है। अन्य समाधान वास्तव में उन सभी सूचियों को फ़्लैट नहीं करते हैं जिन्हें मैंने परीक्षण किया था। यह कार्य काम करने लगता है। मैं इसे यहां पोस्ट कर रहा हूं क्योंकि जब मैंने अपनी खोज की थी तो यह पहली बार Google हिट था।

(defun flatten (LIST) 
    "flattens LIST" 
    (cond 
    ((atom LIST) (list LIST)) 
    ((null (cdr LIST)) (flatten (car LIST))) 
    (t (append (flatten (car LIST)) (flatten (cdr LIST)))))) 

उदा।

(flatten (list "a" (list "b" "c" nil) (list (list "d" "e") "f"))) 
("a" "b" "c" nil "d" "e" "f") 
3

Dash Emacs के लिए एक आधुनिक सूची पुस्तकालय है, और समतल है। मैगिट के बाद Melpa पर यह दूसरा सबसे डाउनलोड किया गया पैकेज है।readme से:

-flatten (l): नेस्टेड सूची l लेता है और इसकी सामग्री को एकल, फ्लैट सूची के रूप में लौटाता है।

(-flatten '((1))) ;; => '(1) 
(-flatten '((1 (2 3) (((4 (5))))))) ;; => '(1 2 3 4 5) 
(-flatten '(1 2 (3 . 4))) ;; => '(1 2 (3 . 4)) 

-flatten-n (num list): एक नेस्टेड सूची के num स्तरों फ़्लैट करें।

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

इस पैकेज 2012-09 शुरू किया गया था।

संबंधित मुद्दे