由一条含简并碱基的核酸序列生成多条不包含简并碱基的核酸序列

# 程序目的:由一条含简并碱基的核酸序列生成多条不包含简并碱基的核酸序列。
# 过程:
# 1.遍历每个碱基,查找其是否属于简并碱基,并返回列表(属于简并碱基)或者碱基(不属于简并碱基)。
# 2.如果属于简并碱基。循环遍历返回简并碱基的列表,并把碱基分别添加到reduce_primer列表的每个核酸序列的末尾。新生成的过渡列表list_mid替换原来的reduce_primer列表。
# 3.如果不属于简并碱基。则把返回的非简并碱基分别直接添加到reduce_primer列表的每个核酸序列的末尾。新生成的过渡列表list_mid替换原来的reduce_primer列表。
# 4.如此循环,直至遍历raw_primer完成。
# 5.保存结果到tsv表格。

# 创建一个将简并碱基映射到可能碱基的字典  
degeneracy_map = {  
    'R': ['A', 'G'],  
    'Y': ['C', 'T'],  
    'M': ['A', 'C'], 
    'K': ['G', 'T'],
    'S': ['G', 'C'],
    'W': ['A', 'T'],
    'H': ['A', 'T', 'C'],
    'B': ['G', 'T', 'C'],
    'V': ['G', 'A', 'C'],
    'D': ['G', 'A', 'T'],
    'N': ['A', 'T','G', 'C']
}  
  
def resolve_degeneracy(degenerate_base):  
    """函数说明:查询输入的碱基是否属于简并碱基,并返回列表(属于简并碱基)或者碱基(不属于简并碱基)"""  
    
    # 检查碱基是否是简并的  
    if degenerate_base in degeneracy_map:  
        # 如果是,从映射中选择一个碱基  
        return degeneracy_map[degenerate_base] 
    else:  
        # 如果不是,直接返回该碱基  
        return degenerate_base  
  
def replace_list(list_A,list_B):
    """函数说明:删除list_A的所有列表元素,再使用list_B的元素来填充"""
    list_A.clear()
    for i in list_B:
        list_A.append(i)
    return list_A
    
def gc_content(s):
    """函数说明:读入DNA序列s,计算s中的GC含量"""
    
    s=s.upper()  #小写字母转换为大写
    gcc = (s.count('C')+s.count('G'))/len(s)*100
    return gcc

# seq='cCGCTTTAAA'
# num=gc_content(seq)
# print(num)  #40.0

def reduce_primer(primer):  
    """该函数用于还原简并引物,并返回多条简并引物的列表"""  
   
    primer=primer.upper() #小写字母转换为大写
    
    reduce_primer=[]
    for i in range(len(primer)):   # 遍历引物的每个位置 
        list_mid=[]  #保存新生成核酸序列的过渡列表
        if len(resolve_degeneracy(primer[i]))>=2:
            if i==0:
                reduce_primer=resolve_degeneracy(primer[i])
#                 print(reduce_primer)
            else:
                for j in resolve_degeneracy(primer[i]):
                    for k in reduce_primer:
                        k+=j
                        list_mid.append(k)
                replace_list(reduce_primer,list_mid)
#                 print(reduce_primer)
       
        else:
            if i==0:
                reduce_primer.append(resolve_degeneracy(primer[i]))
#                 print(reduce_primer)
            else:
                for k in reduce_primer:
                        k+=resolve_degeneracy(primer[i])
                        list_mid.append(k)
                replace_list(reduce_primer,list_mid)
#                 print(reduce_primer)
      
    return reduce_primer

def raw_list_to_multiple_list(raw_list):
    """
    函数说明:输入原始列表,返回多重列表。
    输入原始列表,查询列表元素(核酸序列)的GC含量,然后把GC含量和列表元素保存到一个过渡列表,
    每次循环的过渡列表都加入多重列表multiple_list,最后返回multiple_list。
    """
    multiple_list=[]
    for i in raw_list:
        middle_list=[]
        GC_percent=gc_content(i)
        middle_list.append(round(GC_percent,4))  #保留4位小数
        middle_list.append(i)
        multiple_list.append(middle_list)
    return multiple_list

def list_save_as_csv(list_input):
    import csv
    """函数说明:把多重列表保存为primer.csv文件"""
    
    # 创建CSV文件并打开以供写入数据
    with open("primer.csv", mode="w") as file:
        writer = csv.writer(file)

        # 写入数据
        for i in list_input:
            writer.writerow(i)

        # 关闭文件
        file.close()

raw_primer='TWTTWTTWTTAWA'  #输入含简并碱基的原始核酸序列。
primer=reduce_primer(raw_primer)  #多条核酸序列的列表,里面的核酸序列不含简并碱基。
print(len(primer))  #查看列表里面序列的条数(全部都是不含简并碱基)
# print(primer)
multiple_list=raw_list_to_multiple_list(primer)  #查询GC含量,并保存为多重列表。[[...],[...]...]
# print(multiple_list)  #查看GC含量和序列
list_save_as_csv(multiple_list)  #多重列表保存为primer.csv文件

备注:在网上没找到使用python写的该类脚本,故自己写一个并分享出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值