2012-11-22 22 views
5

मैं "/" का उपयोग करके उप-भागों में एक स्ट्रिंग के रूप में दिए गए पथ को विभाजित करने की कोशिश कर रहा हूं, एक डिलीमीटर पुनरावर्ती और एक ट्यूपल में पारित किया गया। पूर्व के लिए: "ई:/जॉन/2012/अभ्यास/प्रश्न 11" होना चाहिए ('ई:', 'जॉन', '2012', 'अभ्यास', 'प्रश्न 11')।पाइथन स्प्लिट पथ रिकर्सिवली

तो मैंने प्रत्येक चरित्र को "/" को एक टुपल में छोड़कर पारित कर दिया है, लेकिन ऐसा नहीं है कि मैं उदाहरण में प्रदर्शित उप-भागों संयुक्त कैसे चाहता था। यह होमवर्क में एक अभ्यास प्रश्न है और मैं मदद की सराहना करता हूं क्योंकि मैं रिकर्सन सीखने की कोशिश कर रहा हूं।

तुम इतना

उत्तर

10

कुछ इस तरह

>>> import os 
>>> s = "E:/John/2012/practice/question11" 
>>> os.path.split(s) 
('E:/John/2012/practice', 'question11') 

सूचना os.path.split() रूप str.split() होगा

>>> def rec_split(s): 
...  rest, tail = os.path.split(s) 
...  if rest == '': 
...   return tail, 
...  return rec_split(rest) + (tail,) 
... 
>>> rec_split(s) 
('E:', 'John', '2012', 'practice', 'question11') 

संपादित पूरे रास्ते अलग नहीं है: हालांकि सवाल विंडोज रास्तों के बारे में था। यूनिक्स/लिनक्स पथों के लिए इसे संशोधित करना काफी आसान है, जिसमें "/"

>>> def rec_split(s): 
...  rest, tail = os.path.split(s) 
...  if rest in ('', os.path.sep): 
...   return tail, 
...  return rec_split(rest) + (tail,) 
+2

यह समाधान बेहतर है क्योंकि यह ओएस स्वतंत्र है, और इस बारे में कोई धारणा नहीं है कि आगे की स्लेश या बैकस्लाश का उपयोग किया जाता है या नहीं। – DaveP

+0

यह उन पथों के लिए काम नहीं करता है जो '/' से शुरू होते हैं। – asmeurer

+0

यह लिनक्स में काम नहीं करता है, क्योंकि "बाकी" अंततः "/" बन जाता है। दुर्भाग्य से मेरे पास अभी तक वोट करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इस प्रकार यह टिप्पणी। :( मैं इस अब उपयोग कर रहा हूँ: ' डीईएफ़ rec_split (पथ): तत्वों = [] जबकि ((पथ = '/') और (पथ = '')!): पथ, पूंछ = os.path.split (पथ) elements.insert (0, पूंछ) वापसी तत्व ' –

2

आपका त्रुटि प्रत्यावर्तन में नहीं है धन्यवाद, बल्कि आप पुनरावर्ती परिणाम को श्रेणीबद्ध करने के लिए कर रहे हैं क्या। मान लें कि आप ('E:', 'John', '2012', 'prac') पर पहुंच गए हैं, और अगला चरित्र 't' है; आप रिकर्सिव परिणाम के लिए 't' को जोड़ना नहीं चाहते हैं, आप इसे रिकर्सिव परिणाम के अंतिम शब्द में जोड़ना चाहते हैं। इसी तरह, जब आप एक विभाजक तक पहुंचते हैं, तो आप नए शब्द को खाली के रूप में शुरू करना चाहते हैं।

जब आप रिकर्सन कर रहे हों, तो आप (बहुत अधिक) हमेशा दो मामले होंगे: एक रिकर्सिव एक, और एक टर्मिनल। टर्मिनल एक आमतौर पर आसान होता है, और आपने इसे सही तरीके से किया है (यदि कोई स्ट्रिंग नहीं है, तो कोई शब्द नहीं है)। लेकिन मुझे लगता है कि यदि आप रिकर्सिव केस का एक विशिष्ट उदाहरण प्राप्त करने का प्रयास करते हैं, तो ऊपर की तरह मध्य-गणना, वास्तव में क्या करने की आवश्यकता है, यह जानने के लिए।

+0

क्या आप मुझे एक उदाहरण दे सकते हैं? मैं समझ नहीं पा रहा हूं कि इसे बार-बार करने के दौरान आप इसे अंतिम शब्द में जोड़ने के बारे में कैसे जाते हैं। – user1757703

+0

मैं आपके लिए अपना होमवर्क हल नहीं करना चाहता, आपको अभी भी इसके लिए काम करना चाहिए। लेकिन आप 'पथ = last_path [: - 1] + (last_path [-1] + s [0],) के साथ एक tuple के अंतिम तत्व को एक पत्र जोड़ सकते हैं। – Amadan