在for循环中对来自不同字典的值求和

2024-06-01 11:58:03 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在尝试编写一个代码来执行以下操作:

  1. 将多个列表添加到列表中。(含蛋白质序列;又名氨基酸)

  2. 计算每个序列中每个氨基酸(str)的数量(列表)

  3. 创建字典,将每个键(氨基酸)与特定值(分子量)关联

  4. 获得总分子量(乘以每个氨基酸的相关值)

  5. 求每个蛋白质序列的总值(列表)

问题是,;我可以得到每个字典的总和,但我不能求这些字典的最终值的总和。你知道解决这个问题的办法吗

    # Add different list of protein sequences (proteinx) into a list of lists (proteins)
    proteins=[]

    protein1= ['ALA', 'VAL', 'GLY', 'GLU', 'ALA', 'ALA', 'GLY', 'PHE', 'VAL', 'TYR', 'THR', 'Y', 'A', 'W']

    protein2= ['MET', 'K', 'F', 'G', 'N', 'F', 'L', 'LEU', 'T', 'Y', 'Q', 'P', 'P', 'E', 'L', 'SER', 'Q', 'T', 'A','W','CYS','C']

    # Add different list of protein sequences (proteinx) into a list of lists (proteins)
    proteins.append(protein1)
    proteins.append(protein2)

    # Count how many amino acids there are in each list (protein sequence)

    for protein in proteins:
        CAla=(protein.count('A') + protein.count('ALA'))
        CArg=(protein.count('R') + protein.count('ARG'))
        CAsn=(protein.count('N') + protein.count('ASN'))
        CAsp=(protein.count('D') + protein.count('ASP'))
        CCys=(protein.count('C') + protein.count('CYS'))
        CGln=(protein.count('Q') + protein.count('GLN'))
        CGlu=(protein.count('E') + protein.count('GLU'))
        CGly=(protein.count('G') + protein.count('GLY'))
        CHis=(protein.count('H') + protein.count('HIS'))
        CIle=(protein.count('I') + protein.count('ILE'))
        CLeu=(protein.count('L') + protein.count('LEU'))
        CLys=(protein.count('K') + protein.count('LYS'))
        CMet=(protein.count('M') + protein.count('MET'))
        CPhe=(protein.count('F') + protein.count('PHE'))
        CPro=(protein.count('P') + protein.count('PRO'))
        CSer=(protein.count('S') + protein.count('SER'))
        CThr=(protein.count('T') + protein.count('THR'))
        CTrp=(protein.count('W') + protein.count('TRP'))
        CTyr=(protein.count('Y') + protein.count('TYR'))
        CVal=(protein.count('V') + protein.count('VAL'))

      #Create a dictionary to associate each amino acid to its molecular weight and the number of each amino acid
      AAmolma = {'Ala': [CAla * (89)], 'Arg': [CArg * (174)], 'Asn': [CAsn * (132)],
           'Asp': [CAsp * (133)], 'Cys': [CCys * (121)], 'Gln': [CGln * (146)], 'Glu': [CGlu * (147)],
           'His': [CHis * (155)], 'Ile': [CIle * (131)], 'Leu': [CLeu * (131)], 'Lys': [CLys * (146)],
           'Met': [CMet * (149)], 'Phe': [CPhe * (165)], 'Pro': [CPro * (115)], 'Ser': [CSer * (105)],
           'Thr': [CThr * (119)], 'Trp': [CTrp * (204)], 'Tyr': [CTyr * (181)], 'Val': [CVal * (117)], 
           'Gly': [CGly * (75)]}

      #sum all the values in each dictionary and then the total value of each dictionary
        parmw=0
        for mw in AAmolma.values():
            parmw+=sum(mw)
        print(parmw)

     totmw=0
     for i in parmw:
         totmw+=sum(parmw)
    

我得到的是:

1737
2953
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-145-43b4557ce807> in <module>
     38 
     39 totmw=0
---> 40 for i in parmw:
     41     totmw+=sum(parmw)
     42 

TypeError: 'int' object is not iterable

在这个特殊的例子中,我想做的就是求和1737+2953得到4690

谢谢!!希望有人能帮忙


Tags: ofin列表for字典count序列list
1条回答
网友
1楼 · 发布于 2024-06-01 11:58:03

您没有完全按照您提供的说明进行操作。对于步骤#3,您应该“创建一个字典,将每个键(氨基酸)与特定值(分子量)关联起来”,该字典看起来就像:

AAmolma = {'Ala': 89, 'Arg': 174, .....

你把计数乘以,然后把它存入字典。这就违背了使用字典的意义。在使用[CAla * (89)]输入值时,您还创建了一个列表,但这里不需要列表。它是一个单条目列表,始终是一个单条目列表。这就是为什么您需要稍后使用sum(mw)来获取值,而不仅仅是mw

下一个问题是,您将所有列表组合的计数累积到计数器中,例如CAla。你应该独立地为每个序列计数

最后你应该“求每个蛋白质序列的总值(列表)”,因此对于你的例子,应该只有两个答案,因为你有两个序列

如果向上移动字典定义,则可以将for循环更改为

   for protein in proteins:
    total = (
      (protein.count('A') + protein.count('ALA')) * AAmolma['Ala'] +
      (protein.count('R') + protein.count('ARG')) * AAmolma['Arg'] +
      ....
    )
    print(total)

我还希望将被计数的项放入一些常量列表或元组中,比如(('A', 'ALA', 'Ala'), ('R', 'ARG', 'Arg'), ..,并对它们进行迭代,而不是所有这些重复的代码,但您可以将其作为第二步

相关问题 更多 >