कहें कि मेरे पास एक स्ट्रिंग है जो एक समान रूप में है, उदाहरण के लिए, "(1,2,3,4,5)"
होना चाहिए। एक वास्तविक टपल में बदलने का सबसे आसान तरीका क्या है? मैं क्या करना चाहता हूँ का एक उदाहरण है:
tup_string = "(1,2,3,4,5)" tup = make_tuple(tup_string)
स्ट्रिंग पर चलने वाले tuple()
बस पूरी चीज़ को एक बड़ा ट्यूपल बनाते हैं, जबकि मैं जो करना चाहता हूं वह स्ट्रिंग को ट्यूपल के रूप में समझता है। मुझे पता है कि मैं इसके लिए एक रेगेक्स का उपयोग कर सकता हूं, लेकिन मैं उम्मीद कर रहा था कि वहां कम महंगा तरीका है। विचार?
यह पहले से मौजूद है !
>>> from ast import literal_eval as make_tuple >>> make_tuple("(1,2,3,4,5)") (1, 2, 3, 4, 5)
कोने के मामले से अवगत रहें, यद्यपि:
>>> make_tuple("(1)") 1 >>> make_tuple("(1,)") (1,)
अगर आपका इनपुट प्रारूप पायथन से अलग काम करता है, तो आपको उस मामले को अलग से संभालना होगा या किसी अन्य पद्धति का उपयोग करना होगा जैसे tuple(int(x) for x in tup_string[1:-1].split(','))
।
आप SyntaxError
बिना अपनी स्ट्रिंग पार्स कर सकते हैं
def parse_tuple(string): try: s = eval(string) if type(s) == tuple: return s return except: return
यदि यह पार्स सफलता है तो यह फ़ंक्शन Tuple
वापस करता है अन्यथा None
रिटर्न None
print parse_tuple("('A', 'B', 'C')")
हम इसे स्वयं द्वारा पार्स कर सकते हैं। मान लें कि हमारे पास ट्यूपल को पायथन द्वारा नीचे दिया गया है:
((2, 'C/C++', 0, 'clang_cpp'), (3, 'Python相关', 0, 'python'))
यहाँ हम कैसे कर रहे हैं
सबसे पहले, हम ट्यूपल स्ट्रिंग में वर्णों को पढ़ते रहें हैं, लेकिन पिछले बाएं अर्द्धविराम की स्थिति को स्टोर करते हैं और हम कितने सेमीिकलन से मिलते हैं (हम इसे अर्धविराम स्तर छोड़ सकते हैं, सही सेमिकलन के लिए), जब भी हम एक सही अर्धविराम से मिलते हैं, हम करते हैं नीचे बातें:
M
) M
को जोड़ते हैं, जो सरणी सभी M
को स्टोर करेगा जावास्क्रिप्ट कोड नीचे की तरह है:
function parseTuple(t){ var lc = "("; var rc = ")"; var lc_level = 0; var rc_level = 0; var last_lc = 0; var last_rc = 0; var result = []; for(i=0;i<t.length;i++){ if(t[i] == lc){ lc_level++; last_lc = i; }else if(t[i] == rc){ rc_level++; last_rc = i; } if(rc_level == 1){ var substr = t.slice(last_lc+1,last_rc); var data = substr.split(","); result.push(data); lc_level--; rc_level--; i = 0; t = t.slice(0,last_lc) + t.substring(last_rc+1); } if(lc_level == rc_level && lc_level==0){ break; } } return result; }