2016-04-05 132 views
1

我一直在嘗試調整我的python函數來計算字母組而不是單個字母,而且我遇到了一些麻煩。這是我要算單個字母代碼:在一個字符串中計數多個字母組(蟒蛇)

my_seq = "CTAAAGTCAACCTTCGGTTGACCTTGAAAGGGCCTTGGGAACCTTCGGTTGACCTTGAGGGTTCCCTAAGGGTT" 

def count_letters(str): 
    counts = {} 
    for c in str: 
     if c in counts: 
      counts[c]+=1 
     else: 
      counts[c]=1 
    return counts 

counts = count_letters(my_seq) 
print(counts) 

功能目前吐出來計數爲每個字母。現在它打印此:

{'C': 23, 'T': 30, 'G': 30, 'A': 20} 

理想情況下,我想它來打印這樣的:

{'CTA': 2, 'TAG': 3, 'CGC': 1, 'GAG': 2 ... } 

我很新的蟒蛇,這被證明是困難的。

謝謝!

+0

你想爲它計算的單詞列表在哪裏? –

+0

@IronFist我只想計算所有3個字母的組。有沒有辦法讓代碼做到這一點,而不需要定義特定的組? – jarch

回答

7

這可以使用collections.Counter很快完成。

from collections import Counter 

s = "CTAACAAC" 

def chunk_string(s, n): 
    return [s[i:i+n] for i in range(len(s)-n+1)] 

counter = Counter(chunk_string(s, 3)) 
# Counter({'AAC': 2, 'ACA': 1, 'CAA': 1, 'CTA': 1, 'TAA': 1}) 

編輯:爲了詳細說明chunk_string

它需要一個字符串s和塊大小n作爲參數。每個s[i:i+n]是長度爲n個字符的字符串的一部分。循環迭代可以切分字符串的有效索引(0len(s)-n)。所有這些切片然後被分組在列表理解中。等效的方法是:

def chunk_string(s, n): 
    chunks = [] 
    last_index = len(s) - n 
    for i in range(0, last_index + 1): 
     chunks.append(s[i:i+n]) 
    return chunks 
+0

不錯的一個+1 ..;) –

+0

不錯,你能解釋一下返程線路在做什麼嗎? – Keatinge

+0

看起來不錯。有什麼辦法可以將它打印成字典(沒有「Counter」之前)?或者,有沒有辦法做到這一點,而無需從集合中導入?謝謝。 – jarch

1

這基本上是由Jared Goguen第一貼出答案,但在回答OP的評論,對於可能的方式,但不導入模塊:

>>> m 
'CTAAAGTCAACCTTCGGTTGACCTTGAGGGTTCCCTAAGGGTTGGGGATGACCCTTGGGTCTAAAGTCAACCTTCGGTTGACCTTGAGGGTTCCCTAAGGGTT' 
>>> l = [m[i:i+3] for i in range(len(m)-2)] 
>>> 
>>> d = {} 
>>> 
>>> for k in set(l): 
     d[k] = l.count(k) 


>>> d 
{'AAG': 4, 'GGA': 1, 'AAA': 2, 'TAA': 4, 'AGG': 4, 'AGT': 2, 'GGG': 7, 'ACC': 5, 'CGG': 2, 'GGT': 7, 'TCC': 2, 'TGA': 5, 'CAA': 2, 'TGG': 2, 'GTC': 3, 'AAC': 2, 'ATG': 1, 'CTT': 5, 'TCA': 2, 'CCT': 7, 'CCC': 3, 'GTT': 6, 'TTG': 6, 'GAT': 1, 'GAC': 3, 'TCG': 2, 'GAG': 2, 'CTA': 4, 'TTC': 4, 'TCT': 1} 

或者如果你是一個襯衫的粉絲:

>>> d = {k:l.count(k) for k in set(l)} 
相關問題