2011-05-30 60 views
-2

我有这样的字符串的列表:如何从Python中的字符串列表中获取每个位置的字母百分比频率?

列表:

('aatt') 
('aaga') 
('aaac') 
('gtag') 

#the real list have thousands of strings 

最佳期望的结果的表格分隔的文件是这样的:

0  1  2  3 
a:75% a:75% a:50% a:25% 
g:25% t:25% g:25% c:25% 
       t:25% g:25% 
         t:25% 

(标题是没有必要的)

我做了一个bash脚本来做到这一点,但现在我正在学习python,我想用它做。

这是我的bash代码:

#!/bin/bash 

for i in $(echo 1 2 3 4) 

do echo $i && cat FILE | grep N -v | awk -F "" '{print $'$i'}' | awk -f ./WC 

done 

其中WC是以下wordcounter:

BEGIN { 
    FS="[^a-zA-Z]+" 
} 
{ 
    for (i=1; i<=NF; i++) 
      words[toupper($i)]++ 
} 
END { 
    for (i in words) 
     print i, words[i] 
} 
+0

我们是不是在这里根据需求为您制作完整的工作程序。你试过什么了?那么它不起作用呢?更重要的是,**我们如何为您编写代码可以帮助您学习Python?** – 2011-05-30 03:02:30

+0

如果您可以在_bash_中处理该问题,那么Python肯定会觉得太简单:) – sarnold 2011-05-30 03:06:13

+0

这不是一个非常复杂的问题。我用awk和其他bash命令做了一个脚本。我只想在Python中进行一些定位,以便做到这一点。 – Geparada 2011-05-30 03:06:39

回答

3

抵达该处一些苛刻的评论,但我会尽量给你一些指点:)从外观上来看你的数据看起来像你正在试图做SNP呼叫你的序列列表?给定这样的数据:

d = ['aatt','aaga','aaac','gtag'] 

你应该做的第一件事是预先分配一个字典,它将存储每个位置的字母数。我假设你在这里只有4个字母,即a,t,c和g,并且你知道你的字符串的最大长度。如果你没有,你可以提取它是这样:

maxLen = max(map(len,l)) 

一旦你的,创建你的字典:

freqDict = dict([(i,{'a':0.0,'t':0.0,'c':0.0,'g':0.0}) for i in xrange(maxLen)]) 

,然后存储每个位置的字母统计:

for s in l: 
    for i,b in enumerate(s): 
    freqDict[i][b] += 1 

这应该是这样的结果:

In [26]: freqDict 
Out[26]: 
{0: {'a': 3.0, 'c': 0.0, 'g': 1.0, 't': 0.0}, 
1: {'a': 3.0, 'c': 0.0, 'g': 0.0, 't': 1.0}, 
2: {'a': 2.0, 'c': 0.0, 'g': 1.0, 't': 1.0}, 
3: {'a': 1.0, 'c': 1.0, 'g': 1.0, 't': 1.0}} 

从那时起,它就由您决定如何打印结果。可能是更高效的打印,每行一个位置,你的结果,所以你不必在位置的完整列表迭代4倍,即

for i in freqDict: 
    vs = freqDict[i] 
    sumvs = sum(vs.values()) 
    print '%d\t%s' % (i,'\t'.join(['%s:%.1f' % (b[0],b[1]*100/sumvs) for b in vs.items()])) 

生成:

0 a:75.0 c:0.0 t:0.0 g:25.0 
1 a:75.0 c:0.0 t:25.0 g:0.0 
2 a:50.0 c:0.0 t:25.0 g:25.0 
3 a:25.0 c:25.0 t:25.0 g:25.0 
+0

感谢您的指导! 没有人强迫你回答我的问题,但是你帮了我很多:) – Geparada 2011-05-30 03:43:10

+1

不用担心。它可能仍然是一个好主意(正如很多人也敦促你一样)粘贴你的awk脚本并显示你的输入文件的样子。这样,人们可以给你其他解决方案以及优化的方式,因为我猜测你正在处理非常大的数据集。 – diliop 2011-05-30 04:01:11

+0

我想如果速度是一个问题,可以用Numpy模块做一些聪明的事情。 Numpy增加了一个数组对象和许多其他有用的工具,用于统计分析和科学计算。一旦你更熟悉Python的基础知识,我会推荐它。 – nakedfanatic 2011-05-30 05:05:15

相关问题