2016-04-05 14 views
1

私はPython関数を単一文字の代わりに文字グループを数え上げようとしてきましたが、少し問題があります。文字列内の複数の文字グループを集計する(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 ... } 

私は、Pythonに非常に新しいですし、これは難しいことが証明されています。

ありがとうございました!

+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

よく見えます。辞書として印刷する方法はありますか?あるいは、コレクションからインポートすることなくこれを行う方法がありますか?ありがとう。 – 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} 

それともあなたがいる場合1つのライナーのファン:

>>> d = {k:l.count(k) for k in set(l)} 
関連する問題