tcl

2011-10-10 10 views
5

में सूची से एक उपशीर्षक को हटाएं मैं टीसीएल में एक सूची से एक उपसूची को हटाना चाहता हूं। मुझे पता है कि lreplace का उपयोग करके मुख्य सूची के लिए इसे कैसे करना है, लेकिन मुझे नहीं पता कि एक उपन्यासकार के लिए इसे कैसे किया जाए। उदाहरण के लिए:tcl

set a { 1 2 { {3 4} { 4 } } } 

अब मैं आंतरिक सूची { {3 4} {4} } से {4} निकालना चाहते हैं। अंतिम सूची होना चाहिए:

a { 1 2 { {3 4} } }

कृपया सुझाव है कि उसकी डॉट करने के लिए कैसे।

+1

जो हम खो रहे हैं वह मानदंड है जिसे आपको निकालने के लिए तत्व का चयन करने की आवश्यकता है i.e. क्या यह हमेशा तीसरी उप-सूची में दूसरी उप-उप सूची है या कुछ और? –

+0

भी वास्तव में एक नई सूची नहीं बनाता है, यह –

+0

प्रतिस्थापन की जगह नहीं है मानदंड है यदि सूची के आंतरिक उपनिवेश {{3 4} {4}} में दो से कम तत्व हैं, इसे हटा दें। जैसे कि {3 4} में, हमारे पास तत्व हैं लेकिन {4} में केवल एक तत्व है इसलिए मुझे {4} को हटाने की आवश्यकता है। – Ruchi

उत्तर

2

lindex कम्बाइन आंतरिक sublist प्राप्त करने के लिए, lreplace निकाले आंतरिक sublist का एक तत्व को नष्ट करने और lset जगह में वापस संशोधित sublist डाल करने के लिए।

लेकिन ईमानदारी से मुझे आपके डेटा मॉडल के बारे में कुछ गड़बड़ है।

1
proc retlist {a} { 
    set nl "" 
    foreach i $a { 
     if {[llength $i] > 1} { 
      set nl2 "" 
      foreach i2 $i { 
       if {[llength $i2] > 1} { lappend nl2 $i2 } 
      } 
      lappend nl $nl2 
     } else { 
      lappend nl $i 
     } 
    } 
    return $nl 
} 

यदि आपको परिवर्तनीय गहराई की आवश्यकता है तो आप इस कोड के साथ खो गए हैं। इसके लिए आपको रिकर्सन चाहिए।

% set a {1 2 {{3 4} {5}}} 
1 2 {{3 4} {5}} 
% retlist $a 
1 2 {{3 4}} 

चूंकि बाहरी सूची कभी भी tclsh में प्रदर्शित नहीं होती है।

1

यह कुछ ही चाल की आवश्यकता है अच्छी तरह से करने के लिए:

proc lremove {theList args} { 
    # Special case for no arguments 
    if {[llength $args] == 0} { 
     return {} 
    } 
    # General case 
    set path [lrange $args 0 end-1] 
    set idx [lindex $args end] 
    lset theList $path [lreplace [lindex $theList $path] $idx $idx] 
} 

set a [lremove $a 2 1] 

यह काम करता है क्योंकि lset और lindex दोनों रास्तों ले जा सकते हैं, और वे भी एक खाली पथ के साथ समझदार बातें करते हैं।

+0

मुझे लगता है कि उसकी समस्या पथ को जानना होगा ... और इसलिए उसे अपनी सूची को लूप करने की ज़रूरत है, यह देखने के लिए कि उसकी सूची/उपन्यास का कौन सा तत्व एक ही मूल्य (उसका मानदंड) है। – unNamed

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