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

Python计算具有多个键的值的所有实例,python,list,dictionary,Python,List,Dictionary,跳转到编辑以获得更好的解释 我已经试着解决这个问题好几个小时了,但我的头很痛(特别是因为我之前已经解决了,但不记得怎么解决了,我使用解决方案的脚本存储在学校的计算机上) 这就是我的问题。在给定的a、T、G和C序列中(是的,这就是DNA),我必须找到所有的氨基酸,并计算它们的数量。用外行的话说,归根结底就是这个 我必须在序列中搜索特定的模式(也称为密码子)。这些是A和/或T和/或G和/或C的三个字母长的序列。每个氨基酸至少有一个密码子与其相关。我的工作是计算每种氨基酸的含量 在第二张图中,你会看到

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

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

这就是我的问题。在给定的a、T、G和C序列中(是的,这就是DNA),我必须找到所有的氨基酸,并计算它们的数量。用外行的话说,归根结底就是这个

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

在第二张图中,你会看到左边是氨基酸,右边是相关的密码子

我有一本这样设置的词典:

    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的顺序)。例如:

tta,ttg,ctt,ctc,cta,ctg都与氨基酸“L”有关,所以我需要对所有出现的tta,ttg,ctt,ctc,cta,ctg求和,得到氨基酸“L”的出现总量

我希望我足够清楚,这有点难以解释,特别是在尝试为自己这么久而失败之后(这通常表明你对自己正在做的事情几乎一无所知,至少我是这样的:D)

编辑:

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

  • 我们得到一个由字母a、T、C和G组成的序列
  • 我们必须三三两两地解析这个序列

    假设序列为“TTCTTACTC” 我们得到“TTC”,“TTA”,“CTC”
  • 我们现在在字典中查找这些键,并找到相关的氨基酸: TTC是F 埃塔是L CTC是L
  • 我们需要计算F、L和字典中任何其他值(FLIMVSPTAY*HQNKDECWRSG)的数量并存储在列表中
  • 所需的输出将是如下所示的字典:


    如果您使用Python2.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]表示密码子中的c)
    生成氨基酸序列,而不管它们是由哪个密码子编码的

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

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

    如果您使用Python2.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]表示密码子中的c)
    生成氨基酸序列,而不管它们是由哪个密码子编码的

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

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

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

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

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

    counts = collections.defaultdict(int)
    for k in aaDic:
        counts[aaDic[k]] += 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 ]
    
    请尝试以下操作:

    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 ]
    

    使用从@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
    
    然后,您可以将生成的dict与以下内容组合:

    aa_names = set(aaDic.values())
    return dict((aa_name, amino_acids.count(aa_name) for aa_name in aa_names))
    

    使用从@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
    
    然后,您可以将生成的dict与以下内容组合:

    aa_names = set(aaDic.values())
    return dict((aa_name, amino_acids.count(aa_name) for aa_name in aa_names))
    

    请小心使用
    .count
    ,因为它不尊重密码子边界,例如当您可能需要0时,
    'aacgag.count('cga')==1
    。DNA序列应该三乘三解析?从技术上讲,这不是家庭作业。我在上大学,我们可以使用任何我们想要的资源。我们刚刚接到一项任务,我们必须完成它,并在周末提交。实际的赋值比这要复杂一点,但这是我需要解决的部分。是的,DNA应该三乘三地解析……使用
    .count
    时要小心,因为它不尊重密码子边界,例如
    'aacgag'.count('cga'))==1
    当您可能需要0时。DNA序列应该三乘三解析?从技术上讲,这不是家庭作业。我在上大学,我们可以使用任何我们想要的资源。我们刚刚接到一项任务,我们必须完成它,并在周末提交。实际的分配比这稍微复杂一些,但这是我需要解决的部分。是的,DNA应该被三乘三地解析…这导致
    密码子
    ['atc','gtg','agt']
    。这导致
    密码子
    ['atc','gtg','agt']
    。刚试过,但这不是我想要的。它的作用是计算给定字典中某个值出现的频率。我需要的是其他东西,我会编辑我的帖子,并尝试更好地解释。只是尝试了一下,但这不是我想要的。它的作用是计算给定字典中某个值出现的频率。我需要的是其他东西,我会编辑我的帖子,并尝试更好地解释。