从stringparsing元组?
说我有一个string,这是一个元组应该是相同的forms,例如, "(1,2,3,4,5)"
。 什么是最简单的方法转换成一个实际的元组? 我想要做的一个例子是:
tup_string = "(1,2,3,4,5)" tup = make_tuple(tup_string)
只要在string上运行tuple()
就可以使整个事情成为一个大元组,而我想要做的就是把string理解为一个元组。 我知道我可以使用正则expression式,但我希望有一个更便宜的方法。 想法?
它已经存在 !
>>> 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,)
如果你的input格式和Python不同,你需要单独处理这个事件,或者tuple(int(x) for x in tup_string[1:-1].split(','))
使用另外一个方法如tuple(int(x) for x in tup_string[1:-1].split(','))
你可以parsing你的string而不用SyntaxError
def parse_tuple(string): try: s = eval(string) if type(s) == tuple: return s return except: return
如果parsing成功,则此函数返回Tuple
。 否则返回None
。
print parse_tuple("('A', 'B', 'C')")
我们也可以自己parsing它。 假设我们有Python返回的元组,如下所示:
((2, 'C/C++', 0, 'clang_cpp'), (3, 'Python相关', 0, 'python'))
这是我们如何做到的
首先,我们继续阅读元组字符中的字符,但是每当遇到右分号时,我们都会保存最后一个左分号的位置和我们遇到的分号(我们可以称之为左分号级,就像右分号一样)下面的东西:
- 取一个从最后一个分号到当前右分号的子string(在这个子string中,不再有分号,我们只是用“,”将它分割成数组,假设新数组是
M
) - 然后我们将
M
追加到我们的结果数组中,该数组将存储所有的M
- 第三,删除我们从原始string中获取的子string。 最后,做同样的事情,像第1步,直到左和右分号的水平变为0。
JavaScript代码如下所示:
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; }