我想计算所有列中每个字母的出现频率: 例如,我有三个序列:
seq1=AATC
seq2=GCCT
seq3=ATCA
这里,我们有:在第一列'A'的频率是2,'G'是1。 对于第二列:'A'的频率为1,'C'为1,'T'为1.(列的其余部分相同) 首先,我尝试做计算频率的代码我试试这个:
例如:
s='AATC'
dic={}
for x in s:
dic[x]=s.count(x)
这给出了:{'A':2,'T':1,'C':1}
现在,我想将它应用于columns.for我使用此指令:
f=list(zip(seq1,seq2,seq3))
给出:
[('A', 'G', 'A'), ('A', 'C', 'T'), ('T', 'C', 'C'), ('C', 'T', 'A')]
所以,在这里,我计算()中字母的频率: 我怎么能这样做?
如果我处理序列文件,我如何使用此代码将其应用于文件序列? 例如,每次我采用三个序列并应用此代码时,我的文件包含100个序列。
答案 0 :(得分:1)
下面:
sequences = ['AATC',
'GCCT',
'ATCA']
f = zip(*sequences)
counts = [{letter: column.count(letter) for letter in column} for column in f]
print(counts)
输出(重新格式化):
[{'A': 2, 'G': 1},
{'A': 1, 'C': 1, 'T': 1},
{'C': 2, 'T': 1},
{'A': 1, 'C': 1, 'T': 1}]
突出特点:
seq1
,seq2
等,而是将它们放入列表中。*
运算符解压缩列表。答案 1 :(得分:0)
正如我对你上一个问题的回答一样,你应该将你的功能包装在一个函数中:
def lettercount(pos):
return {c: pos.count(c) for c in pos}
然后,您可以轻松地将其应用于zip
:
counts = [lettercount(t) for t in zip(seq1, seq2, seq3)]
或将其组合到现有循环中:
...
counts = []
for position in zip(seq1, seq2, seq3): # sets at same position
counts.append(lettercount(position))
for pair in combinations(position, 2): # pairs within set
...