2009-11-27 11 views
14

मैं श्रृंखलाएं जिनमें तरह दिखाई देने वाले हैं:एक स्ट्रिंग जो tuples की एक सूची का प्रतिनिधित्व करता है पार्स

"(8, 12.25), (13, 15), (16.75, 18.5)" 

और मैं एक अजगर डेटा संरचना में उनमें से प्रत्येक को परिवर्तित करना चाहते हैं। पसंदीदा रूप से फ्लोट मानों की एक जोड़ी युक्त tuples की एक सूची (या tuple)।

मैं eval("(8, 12.25), (13, 15), (16.75, 18.5)") के साथ ऐसा कर सकता हूं जो मुझे टुपल्स का टुपल देता है, लेकिन मुझे नहीं लगता कि बाहरी जानकारी का नैतिक मूल्यांकन एक बुद्धिमान निर्णय होगा।

तो मुझे आश्चर्य हुआ कि एक सुरुचिपूर्ण पायथनिक समाधान कैसा दिख सकता है।

उत्तर

21
>>> import ast 
>>> print ast.literal_eval("(8, 12.25), (13, 15), (16.75, 18.5)") 
((8, 12.25), (13, 15), (16.75, 18.5)) 
+1

jfyi, इस मजबूत नहीं हो सकता है एक भी होने के लिए सूची में tuple। क्या होगा यदि आप इनपुट "(8, 12.25)" था। कि आप एक tuple में एक tuple के बजाय सिर्फ एक tuple मिल जाएगा। मुझे विश्वास है कि इनपुट वांछित नेस्टेड tuple अगर इनपुट था "(8, 12.25), "(पिछला कॉमा नोट करें)। लेकिन मैंने इसका परीक्षण नहीं किया क्योंकि मेरे पास इस मशीन पर पायथन 2.6 स्थापित नहीं है। – Tom

+0

अच्छी पकड़ टॉम। मैंने अभी तक इसके बारे में नहीं सोचा था और यह वास्तव में एक समस्या होगी मेरी स्थिति। मैं इसे पार्सिंग के बाद जांचने जा रहा हूं। सिर के लिए धन्यवाद। दुर्भाग्य से विधि python2.5 में उपलब्ध नहीं है लेकिन मेरे मामले में यह ठीक है क्योंकि मैं इसे ऐप इंजन डेटा आयात स्क्रिप्ट में उपयोग कर रहा हूं और ऐप इंजन में नहीं। – tosh

+0

+1: पहले 'ast.literal_eval' नहीं पता था - और यह बहुत आसान है! –

1

आप एक CSV फ़ाइल के साथ काम कर रहे हैं, और आप "अनुभवहीन" समाधान जो किसी भी त्रुटि को संभाल नहीं करता है की तुलना में अधिक जानना चाहते हैं, तो आप शायद Python's CSV module का उपयोग कर बंद सबसे अच्छा कर रहे हैं।

+0

क्षमा करें मैंने प्रश्न को थोड़ा अस्पष्ट परिभाषित किया है। स्ट्रिंग वास्तव में एक मान है जिसे मैं अल्पविराम/अर्धविराम से अलग मूल्यों में से एक के रूप में प्राप्त करता हूं। मैं प्रश्न से सीएसवी बिट हटा दूंगा क्योंकि यह भ्रमित हो सकता है। मैं रास्ते में सीएसवी मॉड्यूल का उपयोग कर रहा हूँ। यह बहुत अच्छा है। हालांकि उत्तर देने के लिए धन्यवाद। – tosh

1

PyParsing डाउनलोड करें।

मैंने इससे पहले काम किया है। आप इससे कुछ मजबूत मजबूत पार्सिंग व्यवहार प्राप्त कर सकते हैं, और मुझे लगता है कि यह बिल्टिन प्रदान करता है जो इस तरह की चीज़ों के साथ आपकी संपूर्ण पार्सिंग आवश्यकताओं को संभालेगा। अल्पविरामित सूची और nestedExpr देखो।

3
def parse(s): 
    tuples = s.split('), ') 
    out = [] 
    for x in tuples: 
     a,b = x.strip('()').split(', ') 
     out.append((float(a),float(b))) 
    return out 

यह नौकरी करना चाहिए।

2

मैंने अतीत में इस तरह की नौकरियों के लिए safe_eval का उपयोग किया है।

1

व्यवस्थित तरीके से ऐसा करने में क्या गलत है? पर विभाजित ")", तो सूची के माध्यम से जाना है, को दूर सब "("।

>>> s="(8, 12.25), (13, 15), (16.75, 18.5)" 
>>> [ i.replace("(","") for i in s.split(")") ] 
['8, 12.25', ', 13, 15', ', 16.75, 18.5', ''] 
>>> b = [ i.replace("(","") for i in s.split(")") ] 
>>> for i in b: 
... print i.strip(", ").replace(" ","").split(",") 
... 
['8', '12.25'] 
['13', '15'] 
['16.75', '18.5'] 
[''] 

अब आप अपने डेटा संरचना में प्रत्येक तत्व ला सकता है।

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