【发布时间】:2018-07-17 04:37:08
【问题描述】:
我想在 Python 中将 Newick file 转换为分层对象(类似于 this post 中发布的内容)。
我的输入是这样的 Newick 文件:
(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5)F:0.9
原帖逐个字符解析字符串。为了也存储分支长度,我修改了 JavaScript 文件(来自here),如下所示:
var newick = '// (A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5)F:0.9',
stack = [],
child,
root = [],
node = root;
var na = "";
newick.split('').reverse().forEach(function(n) {
switch(n) {
case ')':
// ')' => begin child node
if (na != "") {
node.push(child = { name: na });
na = "";
}
stack.push(node);
child.children = [];
node = child.children;
break;
case '(':
// '(' => end of child node
if (na != "") {
node.push(child = { name: na });
na = "";
}
node = stack.pop();
// console.log(node);
break;
case ',':
// ',' => separator (ignored)
if (na != "") {
node.push(child = { name: na });
na = "";
}
break;
default:
// assume all other characters are node names
// node.push(child = { name: n });
na += n;
break;
}
});
console.log(node);
现在,我想把这段代码翻译成 Python。
这是我的尝试(我知道这是不正确的):
class Node:
def __init__(self):
self.Name = ""
self.Value = 0
self.Children = []
newick = "(A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5,G:0.8)F:0.9"
stack = []
# root = []
# node = []
for i in list(reversed(newick)):
if i == ')':
if na != "":
node = Node()
node.Name = na
child.append(node)
na = ""
stack.append(node)
# insert logic
child = node.Children
# child.append(child)
elif i == '(':
if (na != ""):
child = Node()
child.Name = na
node.append(child)
na = ""
node = stack.pop()
elif i == ',':
if (na != ""):
node = Node()
node.Name = na
node.append(child)
na = ""
else:
na += n
由于我对 JavaScript 完全陌生,因此无法将代码“翻译”成 Python。特别是,我不明白以下几行:
child.children = [];
node = child.children;
如何在 Python 中正确编写此代码,同时提取长度?
【问题讨论】:
标签: javascript python parsing tree logic