查找核苷酸在同一位置出现的次数
Finding how many times a nucleotide appear in the same position
我是 python 的新手,我正在尝试解决一个问题,我得到了一些 dna 序列,例如:
sequences = ["GAGGTAAACTCTG", "TCCGTAAGTTTTC", "CAGGTTGGAACTC", "ACAGTCAGTTCAC", "TAGGTCATTACAG", "TAGGTACTGATGC"]
我想知道核苷酸“A”在所有这些序列的每个位置出现了多少次(答案应该是 'A':[1, 4, 1, 0, 0, 3, 4, 1, 1, 3, 0, 2, 0] 在这种情况下)。
我试图做的是:
'A_pos = {"A":[sum(int(i[0]=="A") for i in sequences), sum(int(i[1]=="A") for i in sequences), sum(int(i[2]=="A") for i in sequences),'
依此类推到索引中的每个位置。
我试图让它一次检查所有位置,而不是手动检查每个位置。
您发布的代码只是部分代码,但您对每个索引迭代 sequences
一次。您可以使用 zip
一次计算它们(即使最后您必须读取每个字符一次,所以我的解决方案只更改读取顺序):
A = []
for s in zip(*sequences):
print(s)
num_a = 0
for nuc in s:
if nuc == "A":
num_a += 1
A.append(num_a)
print(A)
s
的内容是:
('G', 'T', 'C', 'A', 'T', 'T')
('A', 'C', 'A', 'C', 'A', 'A')
('G', 'C', 'G', 'A', 'G', 'G')
以此类推,所以你看到所有的序列都是一次读取一个字符,结果是:
[1, 4, 1, 0, 0, 3, 4, 1, 1, 3, 0, 2, 0]
如果序列的长度不尽相同,可以使用itertools.zip_longest
用另一个字符填充较短的序列。
干杯!
你很接近,但你需要跟踪索引而不是单独的查找
[sum(x[i] == "A" for x in sequences) for i in range(len(sequences[0]))]
这将同时遍历每个索引并为每个核苷酸出现添加一个。
result = {'A': 13*[0], 'G': 13*[0], 'T': 13*[0], 'C': 13*[0]}
for index, sequence in enumerate(zip(*sequences)):
for nucleotide in sequence:
result[nucleotide][index] += 1
输出:
{'A': [1, 4, 1, 0, 0, 3, 4, 1, 1, 3, 0, 2, 0], 'G': [1, 0, 4, 6, 0, 0, 1, 3, 1, 0, 0, 1, 2], 'T': [3, 0, 0, 0, 6, 1, 0, 2, 3, 3, 2, 3, 0], 'C': [1, 2, 1, 0, 0, 2, 1, 0, 1, 0, 4, 0, 4]}
我是 python 的新手,我正在尝试解决一个问题,我得到了一些 dna 序列,例如:
sequences = ["GAGGTAAACTCTG", "TCCGTAAGTTTTC", "CAGGTTGGAACTC", "ACAGTCAGTTCAC", "TAGGTCATTACAG", "TAGGTACTGATGC"]
我想知道核苷酸“A”在所有这些序列的每个位置出现了多少次(答案应该是 'A':[1, 4, 1, 0, 0, 3, 4, 1, 1, 3, 0, 2, 0] 在这种情况下)。 我试图做的是:
'A_pos = {"A":[sum(int(i[0]=="A") for i in sequences), sum(int(i[1]=="A") for i in sequences), sum(int(i[2]=="A") for i in sequences),'
依此类推到索引中的每个位置。 我试图让它一次检查所有位置,而不是手动检查每个位置。
您发布的代码只是部分代码,但您对每个索引迭代 sequences
一次。您可以使用 zip
一次计算它们(即使最后您必须读取每个字符一次,所以我的解决方案只更改读取顺序):
A = []
for s in zip(*sequences):
print(s)
num_a = 0
for nuc in s:
if nuc == "A":
num_a += 1
A.append(num_a)
print(A)
s
的内容是:
('G', 'T', 'C', 'A', 'T', 'T')
('A', 'C', 'A', 'C', 'A', 'A')
('G', 'C', 'G', 'A', 'G', 'G')
以此类推,所以你看到所有的序列都是一次读取一个字符,结果是:
[1, 4, 1, 0, 0, 3, 4, 1, 1, 3, 0, 2, 0]
如果序列的长度不尽相同,可以使用itertools.zip_longest
用另一个字符填充较短的序列。
干杯!
你很接近,但你需要跟踪索引而不是单独的查找
[sum(x[i] == "A" for x in sequences) for i in range(len(sequences[0]))]
这将同时遍历每个索引并为每个核苷酸出现添加一个。
result = {'A': 13*[0], 'G': 13*[0], 'T': 13*[0], 'C': 13*[0]}
for index, sequence in enumerate(zip(*sequences)):
for nucleotide in sequence:
result[nucleotide][index] += 1
输出:
{'A': [1, 4, 1, 0, 0, 3, 4, 1, 1, 3, 0, 2, 0], 'G': [1, 0, 4, 6, 0, 0, 1, 3, 1, 0, 0, 1, 2], 'T': [3, 0, 0, 0, 6, 1, 0, 2, 3, 3, 2, 3, 0], 'C': [1, 2, 1, 0, 0, 2, 1, 0, 1, 0, 4, 0, 4]}