列python中的字母频率

时间:2014-01-13 23:19:19

标签: python frequency

我想计算所有列中每个字母的出现频率: 例如,我有三个序列:

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个序列。

2 个答案:

答案 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}]

突出特点:

  • 我们不是明确命名seq1seq2等,而是将它们放入列表中。
  • 我们使用*运算符解压缩列表。
  • 我们在列表理解中使用dict理解来生成每列中每个字母的计数。它基本上是你对单序列情况所做的,但更具可读性(IMO)。

答案 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
        ...