2016-07-31 36 views
3

所以基本上我有一個字符串:改變字符串的特定部分在python(在進化樹的更新引導值)

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]] 

每個都包含一個關係及其更新的引導值。我需要做的就是創建最後一個字符串:

final = '(((A,B)321,C)654,(D,E)987)531' 

其中所有引導值都更新爲list_1中的值。我有一個函數刪除引導值:

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

這是一個使用Biopython的解決方案。首先你需要加載你的樹木。如果您使用的字符串,你需要先加載,然後作爲StringIO,因爲解析器只接受文件句柄:

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 

現在,你有樹加載,讓我們找到了分支和更新一些的值。這應該被重構,以接受分支名稱的列表,並返回分支的列表傳遞給common_ancestor,功能,但爲了說明:

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 

現在打印樹的Newick格式

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; 

注意(A,B)的置信度值現在是321而不是123.