Python计算具有多个键的值的所有实例

时间:2012-02-23 23:06:39

标签: python list dictionary

跳转到编辑以获得更好的解释!

我试图让这个问题解决好几个小时了,我的脑袋很疼(特别是因为我之前已经解决了但是不记得怎么样,我使用我的解决方案的脚本存储在一台计算机上学校)。

好的,这是我的问题。在给定的A,T,G和C的序列中(是的,这就是DNA),我必须找到所有的氨基酸并计算它们的数量。通俗地说,它归结为此。

我必须在序列中搜索某些模式(也称为密码子),它们是A和/或T和/或G和/或C的三个字母长的序列。每个氨基酸具有至少一个与其相关的密码子。我的工作是计算每种氨基酸的出现量。

在第二个table中,你会看到左边的氨基酸和右边的相关密码子。

我有一个字典设置如下:

    aaDic = {'ttt': 'F', 'tct': 'S', 'tat': 'Y', 'tgt': 'C',
    'ttc': 'F', 'tcc': 'S', 'tac': 'Y', 'tgc': 'C',
    'tta': 'L', 'tca': 'S', 'taa': '*', 'tga': '*',
    'ttg': 'L', 'tcg': 'S', 'tag': '*', 'tgg': 'W',
    'ctt': 'L', 'cct': 'P', 'cat': 'H', 'cgt': 'R',
    'ctc': 'L', 'ccc': 'P', 'cac': 'H', 'cgc': 'R',
    'cta': 'L', 'cca': 'P', 'caa': 'Q', 'cga': 'R',
    'ctg': 'L', 'ccg': 'P', 'cag': 'Q', 'cgg': 'R',
    'att': 'I', 'act': 'T', 'aat': 'N', 'agt': 'S',
    'atc': 'I', 'acc': 'T', 'aac': 'N', 'agc': 'S',
    'ata': 'I', 'aca': 'T', 'aaa': 'K', 'aga': 'R',
    'atg': 'M', 'acg': 'T', 'aag': 'K', 'agg': 'R', 
    'gtt': 'V', 'gct': 'A', 'gat': 'D', 'ggt': 'G',
    'gtc': 'V', 'gcc': 'A', 'gac': 'D', 'ggc': 'G',
    'gta': 'V', 'gca': 'A', 'gaa': 'E', 'gga': 'G',
    'gtg': 'V', 'gcg': 'A', 'gag': 'E', 'ggg': 'G'
   }

我当然可以计算每个密码子的出现次数,但由于每个氨基酸有多个密码子,我真的需要特定密码子的总和。

    for codons in aaDic:
    s.count(codons)

(s是上面代码中a,t,c,g的序列)。例如:

tt,ttg,ctt,ctc,cta,ctg都与氨基酸'L'相关联,所以我需要总结tta,ttg,ctt,ctc,cta,ctg的所有出现以获得总量氨基酸'L'的出现。

我希望我足够清楚,这有点难以解释,特别是在尝试为自己做这么久并且失败之后(这通常表明你几乎不知道你在做什么,至少那是我的情况:D)

修改

让我试着让自己更清楚一点:

  1. 我们给出了一个由字母A,T,C和G组成的序列。
  2. 我们必须逐个解析这个序列。

      

    假设序列为“TTCTTACTC”   我们得到“TTC”,“TTA”,“CTC”

  3.   
  4. 我们现在在字典中查找这些键,我们找到相关的氨基酸:   TTC是F.   TTA是L.   CTC是L
  5.   
  6. 我们需要在字典中统计并存储F,L和任何其他值(FLIMVSPTAY * HQNKDECWRSG)的数量。
  7.      所需的输出将是如此的字典:

    {L:total no. of the amino acid 'L' in the sequence, S:total no. of the amino acid 'S' in the sequence, ...}
    

4 个答案:

答案 0 :(得分:2)

如果您使用Python 2.7或更高版本,则可以使用collections.Counter来计算氨基酸。首先,将碱基序列分成密码子,然后计算每个密码子对应的氨基酸:

base_seq = "atcgtgagt"
codons = [base_seq[i:i + 3] for i in range(0, len(base_seq), 3)]
amino_acid_counts = collections.Counter(aaDict[c] for c in codons)

请注意,生成器表达式(aaDict[c] for c in codons)会生成一系列氨基酸,无论它们编码的是哪个密码子。

如果您使用的是早期版本的Python,您还可以使用普通字典进行计数:

amino_acid_counts = dict.fromkeys(aaDict.values(), 0)
for c in codons:
    amino_acid_counts[aaDict[c]] += 1

答案 1 :(得分:1)

如果您没有2.7+,您仍然可以使用defaultdict

counts = collections.defaultdict(int)
for k in aaDic:
    counts[aaDic[k]] += 1

答案 2 :(得分:1)

尝试以下方法:

y = {}
for x in aaDic.items():
    y[x[1]] = []
for x in aaDic.items():
    y[x[1]].append(x[0])

然后你可以用X键找到所有值:

xkv = [ k for k in y.keys() if len(y[k]) == X ]

答案 3 :(得分:1)

使用从@ sven-marnach拆分的密码子:

base_seq = "atcgtgagt"

# split sequence, 3 by 3
codons = [base_seq[i:i + 3] for i in range(0, len(base_seq), 3)]

# for each codon we have, obtain his associated amino_acid from aaDic
amino_acids = map(aaDic.get, base_seq)
# here, amino_acids is ['I', 'V', 'S']

i_count = amino_acids.count('I')
# and so on

然后你可以用:

组合你生成的词典
aa_names = set(aaDic.values())
return dict((aa_name, amino_acids.count(aa_name) for aa_name in aa_names))