在python中更改字符串的特定部分(更新系统发生树中的bootstrap值)

时间:2016-07-31 21:57:14

标签: python biopython statistics-bootstrap phylogeny

所以基本上我有一个字符串:

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

我完全不知所措。一旦嵌套关系的引导值更新,我无法弄清楚如何让程序识别更大的关系。任何帮助将不胜感激!

1 个答案:

答案 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。