如何用字典推导式优化生物信息学带伪计数的motif计数矩阵生成代码
带伪计数的Motif计数矩阵实现
需求描述
实现一个接收核苷酸motif字符串列表的函数,统计每一列中A、C、G、T四种核苷酸的出现次数,每个统计结果加1伪计数,最终输出单键对应多值的字典格式结果,禁止使用biopython、numpy等第三方库。
输入样例
Motifs =[ "AACGTA", "CCCGTT", "CACCTT", "GGATTA", "TTCCGG" ]
输出样例
count ={ 'A': [2, 3, 2, 1, 1, 3], 'C': [3, 2, 5, 3, 1, 1], 'G': [2, 2, 1, 3, 2, 2], 'T': [2, 2, 1, 2, 5, 3] }
原有实现
原有版本逻辑正确,通过两次循环分别初始化伪计数、累加统计实际出现次数:
def CountWithPseudocounts(Motifs): t = len(Motifs) k = len(Motifs[0]) count = {} for symbol in "ACGT": count[symbol] = [1 for j in range(k)] for i in range(t): for j in range(k): symbol = Motifs[i][j] count[symbol][j] += 1 return count
字典推导式优化版本
利用Python内置的zip(*可迭代对象)特性可以直接将motif列表转置为列集合,结合字典推导式+列表推导式即可直接生成目标结果,完全替换原有两层循环逻辑:
def CountWithPseudocounts(Motifs): cols = list(zip(*Motifs)) return {base: [1 + col.count(base) for col in cols] for base in "ACGT"}
逻辑说明
zip(*Motifs)会把输入的每一条序列作为行,转置后得到每一列所有位置的核苷酸集合- 外层字典推导式遍历
ACGT四个碱基作为返回字典的键 - 内层列表推导式遍历每一列,统计当前碱基在该列的出现次数,加1后作为列表对应位置的数值
该实现完全不依赖第三方库,输出格式和要求完全匹配,运行效率和原有实现一致,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Peter Wohlfarth
相关产品推荐
相关产品推荐

