2010-04-11 8 views
8

अभी भी लिस्प व्यंजनों और मुहावरे पर काम कर रहा है।लिस्प: एक सूची में सूचियों की एक सूची को समेकित करें?

((a b c) (d e f) nil (g h)) 

मुझे लगता है कि मजबूत करने के लिए एक सूची करना चाहते हैं,

(a b c d e f g h) 

लगता है जैसे वहाँ उस के लिए एक एक लाइनर हो oughta:

मैं इस तरह एक सूची है।

उत्तर

7
(apply #'append '((a b c) (d e f) (g h i))) 

या

(loop for outer in '((a b c) (d e f) (g h i)) 
     nconcing (loop for inner in outer collecting inner)) 
+0

बिल्कुल सही! - मुझे जिस चीज की जरूरत थी। – Cheeso

+1

'nconc' (और 'mapcan') आपके स्वास्थ्य के लिए खराब हो सकता है। –

+1

@ एली: निश्चित रूप से। लेकिन ऊपर लूप में यह ठीक है, या यह है? आंतरिक पाश ताजा सूचियां देता है, इसलिए 'nconc'ing ठीक है। – Dirk

3

एक ठेठ होमवर्क सवाल है कि। आम तौर पर इस ऑपरेशन को FLATTEN कहा जाता है (जो सभी स्तरों पर सूचियों को फ़्लैट करता है)।

(mapcan #'copy-list '((a b c) (d e f) nil (g h))) 

लागू संस्करण समस्या यह है कि कॉल-ARGUMENTS सीमा जब वहाँ कॉल-ARGUMENTS-सीमा से अधिक उप-सूचियों हैं में पड़ सकते हैं है।

उदाहरण के लिए देखें भी http://rosettacode.org/wiki/Flatten_a_list#Common_Lisp

+0

धन्यवाद। यह निश्चित रूप से मेरे लिए होमवर्क नहीं था। शायद 20 साल पहले, हो सकता है कि मैंने इसे होमवर्क प्रश्न के रूप में लिया हो, लेकिन मुझे अब तक याद नहीं है! – Cheeso

+0

@ चेसियो: यह एक संकेत था कि आप इसके लिए समाधान ढूंढ सकते हैं ... –

0

तुम भी उपयोग कर सकते हैं reduce और append: क्योंकि यह append कॉल एक बहुत और प्रतियां

(reduce #'append '((a b c) (d e f) nil (g h))) 

दुर्भाग्य से यह बहुत कम समय और स्थान अन्य समाधान की तुलना में कुशल है परिणामस्वरूप प्रगति अनावश्यक रूप से।

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