2011-05-30 50 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

相關問題