1

複数の遺伝子を含む辞書があります。tuple(zip())は、各サイトのヌクレオチドを提供します。例:(A、A、A)、(T、T、G)など。各サイトのヌクレオチド数を数えようとしています。サイト1には3つのAが表示され、サイト2には2つのTと1つのGが表示されます。コードを実行すると、Aに追加されるだけで、他には何も追加されません。

List = tuple(zip(*myDict.values()))

A = 0
T = 0
G = 0
C = 0

site = 0

for value in List:
    site +=1
    if 'A':
        A += 1
    elif 'T':
        T += 1
    elif 'G':
        G += 1
    else:
        C =+ 1

print 'Site:', site
print 'A:', A
print 'T:', T
print 'G:', G
print 'C:', C
4

4 に答える 4

7

あなたは(再び)、最もよく使うことができますcollections.Counter()

[Counter(site) for site in zip(*myDict.values())]

これにより、サイトごとの遺伝子数のリストが作成されます。

デモンストレーション:

>>> from collections import Counter
>>> myDict = {'abc':'AGCTAC', 'def': 'AGGTAC', 'ghi':'AGGTAG'}
>>> result = [Counter(site) for site in zip(*myDict.values())]
>>> result
[Counter({'A': 3}), Counter({'G': 3}), Counter({'G': 2, 'C': 1}), Counter({'T': 3}), Counter({'A': 3}), Counter({'C': 2, 'G': 1})]
>>> result[0]  # genes at site 0
Counter({'A': 3})
>>> result[2]  # genes at site 2
Counter({'G': 2, 'C': 1})
于 2012-09-28T15:31:13.243 に答える
6

使用Counter()

>>> from collections import Counter
>>> lis=[('A', 'A', 'A'), ('T', 'T', 'G')]
>>> Counter(y for x in lis for y in x)
Counter({'A': 3, 'T': 2, 'G': 1})

または、@ Steven Rumbalskiが提案しitertools.chain()たように、ジェネレータ式の代わりに次の式を使用します。

>>> from itertools import chain
>>> Counter(chain(*lis))
Counter({'A': 3, 'T': 2, 'G': 1}) 

個々のサイトの個別のカウンターについては、MartijnPietersの回答を参照してください。

于 2012-09-28T15:29:58.007 に答える
6

ITYM

for value in List:
    site +=1
    if value == 'A':
        A += 1
    elif value == 'T':
        T += 1
    elif value == 'G':
        G += 1
    else:
        C +=1

しかし、もっと良い方法があります。他の答えを参照してください。

その上、あなたはあなたのリストを呼ぶべきではありませんList; 大文字の名前はクラス用に予約されています。listビルトインを隠すので、あまり良くありませんlist()

于 2012-09-28T15:30:19.633 に答える
3
A = List.count("A")
B = List.count("C")
...

ところでリストはひどい変数名です

于 2012-09-28T15:29:53.660 に答える