所以基本上我有一个字符串:
string_1 = '(((A,B)123,C)456,(D,E)789)135'
包含具有引导值的系统发育树是括号表示法(对问题不是很重要,但是如果有人想知道的话)。此示例树包含四个与四个引导值(每个右括号后面的数字)的关系。我在列表列表中包含了这些关系:
list_1 = [['(A,B)', 321], ['((A,B),C)', 654],
['(D,E)', 987], ['(((A,B),C),(D,E))', 531]]
每个都包含一个关系及其更新的bootstrap值。我需要做的就是创建一个最终的字符串:
final = '(((A,B)321,C)654,(D,E)987)531'
其中所有引导程序值都更新为list_1中的值。我有一个删除bootstrap值的函数:
import re
def remove_bootstrap(string):
matches = re.split(r'(?<=\))\d+\.*\d*', string)
matches = ''.join(matches)
return matches
和隔离关系的代码:
list_of_bipart_relationships = []
for bipart_file in list_bipart_files:
open_file = open(bipart_file)
read_file = open_file.read()
length = len(read_file)
for index in range(1, length):
if read_file[index] == '(':
parenthesis_count = 1
for sub_index in range(index + 1, length):
if read_file[sub_index] == '(':
parenthesis_count += 1
if read_file[sub_index] == ')':
parenthesis_count -= 1
if parenthesis_count == 0:
bad_relationship = read_file[index:sub_index + 1]
relationship_without_values = remove_length(bad_relationship)
bootstrap_value = extract(sub_index, length, read_file)
pair = []
pair.append(bootstrap_value)
pair.append(relationship_without_values)
list_of_bipart_relationships.insert(0, pair)
break
我完全不知所措。一旦嵌套关系的引导值更新,我无法弄清楚如何让程序识别更大的关系。任何帮助将不胜感激!
答案 0 :(得分:1)
这是使用Biopython的解决方案。首先,你需要加载你的树木。如果您正在使用字符串,则需要首先加载from io import StringIO
from Bio.Phylo.NewickIO import Parser
string_1 = u'(((A,B)123,C)456,(D,E)789)135'
handle = StringIO(string_1)
tree = list(Parser(handle).parse())[0] # Assuming one tree per string
,因为Parser只接受文件句柄:
common_ancestor
现在你已经加载了树,让我们找到clades并更新一些值。这应该重构为接受进化枝名称列表的函数,并返回要传递给clade_A = list(tree.find_clades(target="A"))[0]
clade_B = list(tree.find_clades(target="B"))[0]
tree.common_ancestor(clade_A, clade_B).confidence = 321
的进化枝列表,但为了说明:
print(tree.format("newick"))
# Outputs
# (((A:1.00000,B:1.00000)321.00:1.00000,C:1.00000)456.00:1.00000,(D:1.00000,E:1.00000)789.00:1.00000)135.00:1.00000;
现在将树打印为Newick格式
i --> 0
注意(A,B)的置信度值现在是321而不是123。