如何在Python中比较不相同的列表并从字典中派生值?

如何在Python中比较不相同的列表并从字典中派生值?,python,list,dictionary,bioinformatics,enumerate,Python,List,Dictionary,Bioinformatics,Enumerate,这是一个字典键,用于存储每个密码子(如ATG、GCT等三重碱基)的氨基酸值(单个字母) 正如我们所看到的,几个密码子可以编码相同的氨基酸(例如GGT、GGC、GGA、GGG等,所有密码子都编码甘氨酸(G))。它们是同义的(DSyn),如果密码子编码不同的氨基酸,它们是非同义的(DNonsyn) 如果有人感兴趣,这是的扩展 我有以下顺序: list1 = ['ACT','ACT','nonsyn','G','L'] list2 = ['ACT','ACC','GGT','ATT'] 这里,,

这是一个字典键,用于存储每个密码子(如ATG、GCT等三重碱基)的氨基酸值(单个字母)

正如我们所看到的,几个密码子可以编码相同的氨基酸(例如GGT、GGC、GGA、GGG等,所有密码子都编码甘氨酸(G))。它们是同义的(DSyn),如果密码子编码不同的氨基酸,它们是非同义的(DNonsyn)

如果有人感兴趣,这是的扩展

我有以下顺序:

list1 = ['ACT','ACT','nonsyn','G','L']

list2 = ['ACT','ACC','GGT','ATT']
这里,, -列表1是根据之前的计算得出的,因此它是碱、氨基酸(单字母条目)和非同步(空)的组合。 -list2是一个包含三重态密码子的列表

在这段代码中,我需要比较list1和list2。必须仅将列表1中的每个元素与对应的列表2中的元素进行比较,才能执行以下操作:

  • 如果两个列表中都有密码子碱基,则比较碱基: A.如果基是相同的
    (例如ACT,ACT)
    ,则不执行任何操作。 B如果碱基不相同
    (如ACT、ACC)
    ,则在字典中查找氨基酸。如果氨基酸相同,则将
    countDsyn
    增加1;如果氨基酸不同,则将
    countDnonsyn
    增加1

  • 如果将列表1中的“nonsyn”与列表2进行比较,则不执行任何操作

  • 如果将列表1中的氨基酸与列表2进行比较:请从氨基酸字典中查找列表2对应的氨基酸。 A.如果氨基酸相同,则将countDsyn增加1 B如果氨基酸相同,则将countDnonsyn增加1

  • 给定情况下的最终输出:

    Dsyn=2
    Dnonsyn=1

    在比较if循环时,需要帮助检查我从字典调用值的方式是否正确

    尝试的代码:

    countDsyn = 0
    countDnonsyn = 0
    
    for pos1,value1 in enumerate(list1):
        for pos2,value2 in enumerate(list2):
            if value1 in list1 = combination(ATGC,3): #eg. ACT,AGT,TTT etc. There are can be 64 such combinations
                if value1 in list1 == value2 in list2: #eg. ACT, ACT
                    #Do nothing
                if value1 in list1 != value1 in list2: #eg. ACT,ACC
                    if value1[aminoacid] == value2[aminoacid]:
                        countDsyn =+1
                    else:
                        countDnonsyn =+1
            if value1 in list1 = "nonsyn":
                #Do nothing
            if value1 in list1 = (A-Z): #eg. 'G''L' etc.
                if value1 == value2[aminoacid] #eg. comparing 'G' and the aminoacid value of GTT from the dictionary
                    countDsyn =+ 1
                if value1 != value2[aminoacid]:
                    countDnonsyn =+1
    

    试着这样做:

    cleared_list1 = [x for x in list1 if x != "nonsyn"]
    cleared_list2 = [x for x in list2 if x != "nonsyn"]
    
    cur_position = 0
    for element1, element2 in zip(cleared_list1, cleared_list2):
        # Compare elements and update counters here.
    
        cur_position += 1
    
    for value1, value2 in zip(list1, list2):
        # Condition 2 in your question
        if value1 == 'nonsyn':
            continue
        # Condition 1 in your question
        if value1 in aminoacid.keys():
            if value1 == value2:
                continue
            elif aminoacid[value1] == aminoacid[value2]:
                countDsyn += 1
            else:
                countDnonsyn += 1
        # Condition 3 in your question
        else:
            if aminoacid[value2] == value1:
                countDsyn += 1
            else:
                countDnonsyn += 1
    

    使用
    zip
    将按顺序迭代两个列表的元素。

    您需要这样的内容:

    cleared_list1 = [x for x in list1 if x != "nonsyn"]
    cleared_list2 = [x for x in list2 if x != "nonsyn"]
    
    cur_position = 0
    for element1, element2 in zip(cleared_list1, cleared_list2):
        # Compare elements and update counters here.
    
        cur_position += 1
    
    for value1, value2 in zip(list1, list2):
        # Condition 2 in your question
        if value1 == 'nonsyn':
            continue
        # Condition 1 in your question
        if value1 in aminoacid.keys():
            if value1 == value2:
                continue
            elif aminoacid[value1] == aminoacid[value2]:
                countDsyn += 1
            else:
                countDnonsyn += 1
        # Condition 3 in your question
        else:
            if aminoacid[value2] == value1:
                countDsyn += 1
            else:
                countDnonsyn += 1
    

    “本”的回答很好。还有两件事。你的
    氨基酸
    字典有个错误。其中一个甘氨酸密码子是CGT,应该是GGT。也不是条件

    如果len(value1)==3:

    您可能想使用

    如果氨基酸中的值1.keys():


    直接测试你的三联体是否在一组允许的密码子中。如果将“7&D”作为三元组,则上面的变量也是正确的。

    是否必须仅将第一个列表中的每个元素与第二个列表中相同位置的元素(不包括“非同步”)进行比较?是的,列表1中的每个元素必须仅与对应的元素列表2进行比较。感谢您指出这一点。如果您试图比较同义替代率和非同义替代率,我建议您看看像PAML这样的包,它有一个合适的替代模型,而不仅仅是计数。如果你想使用Python,你可以通过BioPython来实现,我会试试这个。但是,在我的实际代码中,我不知道调用字典是否正确,以及在每个上下文中调用字典的方式是否正确。使用两个
    for
    循环不会有帮助,因为第一个列表中的每个元素与第二个列表中的每个元素都进行了计算。不用担心!撇开其他问题不谈,您的字典在代码中的查找是向后的:
    value1[aminoacid]
    应该是
    aminoacid[value1]
    dict[key]
    不是
    key[dict]
    )我看到了我犯的错误。我在括号内调用字典,这把它搞砸了。对不起,我重新检查了所有条件,我想它不符合条件1 a)。也就是说,如果我有list1=CGT和list2=CGT,那么它应该根本不算。这里的Dsyn=0和Dnonsyn=0是一个很好的建议。我不知道什么是氨基酸或密码子