基本DNA编码练习



我最近在一次面试中失败了,在面试中我突然被抛出了一个Python编码问题。我目前正在学习Python,如果我再次遇到同样的问题或类似的问题,我希望能够回答

问题如下:

编写一个函数,该函数将包含字母[a,C,G,T]的字符串作为其输入;并输出在输入中找到的所有3字母子序列以及它们出现的频率。例如,如果输入字符串是"0";ACTACTTAC";,输出将类似于:

ACT: 2
CTA: 1
TAC: 2
CTT: 1
TTA: 1

事后我想出了一些想法,我想知道这样的解决方案是否有效,或者有更好的方法吗?

def Determine_DNA(dna_list):
n = len(dna_list[0])
A = [0]*n
T = [0]*n
G = [0]*n
C = [0]*n
for dna in dna_list:
for index, base in enumerate(dna):
if base == 'A':
A[index] += 1
elif base == 'C':
C[index] += 1
elif base == 'G':
G[index] += 1
elif base == 'T':
T[index] += 1
return A, C, G, T

@mousetail在使用collections.Counter的注释中提到。下面是一个例子:

import collections
def dna_freq(dnaseq):
seq_list = []
for i in range(2, len(dnaseq)):
seq_list.append(dnaseq[i-2:i+1])
return dict(collections.Counter(seq_list))
print(dna_freq("ACTACTTAC"))

{'ACT': 2, 'CTA': 1, 'TAC': 2, 'CTT': 1, 'TTA': 1}

如果你喜欢难以阅读的代码,那可能是代码高尔夫球:

def dna_freq(dnaseq):
return dict(collections.Counter([dnaseq[i-2:i+1] for i in range(2, len(dnaseq))]))

从评论中使用zip的例子,这感觉比列表理解更容易接近。它确实提供了一个略有不同但完全可用的输出。

def dna_freq(dnaseq):
return dict(collections.Counter(zip(dnaseq, dnaseq[1:], dnaseq[2:])))

这适用于您的情况:

dna = "ACTACTTAC"
LEN = 3
d = set()
for i in range(len(dna)-LEN):
k = dna[i:i+LEN]
if not k in d:
print(f'{k}: {dna.count(k)}')
d.add(k)

输出:

ACT: 2
CTA: 1
TAC: 2
CTT: 1
TTA: 1

最新更新