如何比较不相同的列表并从 Python 中的字典中导出值?

How to compare non-identical lists and derive values from a dictionary in Python?

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

aminoacid = {'TTT' : 'F','TTC' : 'F','TTA' : 'L','TTG' : 'L','CTT' : 'L','CTC' : 'L','CTA' : 'L','CTG' : 'L','ATT' : 'I','ATC' : 'I','ATA' : 'I','ATG' : 'M','GTT' : 'V','GTC' : 'V','GTA' : 'V','GTG' : 'V','TCT' : 'S','TCC' : 'S','TCA' : 'S','TCG' : 'S','CCT' : 'P','CCC' : 'P','CCA' : 'P','CCG' : 'P','ACT' : 'T','ACC' : 'T','ACA' : 'T','ACG' : 'T','GCT' : 'A','GCG' : 'A','GCA' : 'A','GCG' : 'A','TAT' : 'Y','TAC' : 'Y','TAA' : 'STOP','TAG' : 'STOP','CAT' : 'H','CAC' : 'H','CAA' : 'Q','CAG' : 'Q','AAT' : 'N','AAC' : 'N','AAA' : 'K','AAG' : 'K','GAT' : 'D','GAC' : 'D','GAA' : 'E','GAG' : 'E','TGT' : 'C','TGC' : 'C','TGA' : 'STOP','TGG' : 'W','CGT' : 'R','CGC' : 'R','CGA' : 'R','CGG' : 'R','AGT' : 'S','AGC' : 'S','AGA' : 'R','AGC' : 'R','CGT' : 'G','GGC' : 'G','GGA' : 'G','GGG' : 'G',}

如您所见,多个密码子可以编码相同的氨基酸(例如 GGT、GGC、GGA、GGG 等,所有密码子都编码甘氨酸 (G))。这些是同义的 (DSyn),如果密码子编码不同的氨基酸,它们是非同义的 (DNonsyn)

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

我有以下序列:

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

list2 = ['ACT','ACC','GGT','ATT']

在这里, - list1 源自先前的计算,因此它是碱基、氨基酸(单字母条目)和 nonsyn(空)的组合。 - list2 是包含三联体密码子的列表。

在这段代码中,我需要比较 list1 和 list2。 list1 中的每个元素必须只与相应的元素 list2 进行比较以执行以下操作:

  1. 如果两个列表中都存在密码子碱基,则比较碱基: 一个。如果碱基相同 (eg. ACT, ACT) 则什么也不做。 b.如果碱基不相同 (eg. ACT, ACC) 则在字典中查找氨基酸。如果氨基酸相同则将 countDsyn 增加 1,如果它们不相同则将 countDnonsyn 增加 1

  2. 如果 list1 中的 'nonsyn' 与 list2 进行比较,则什么也不做。

  3. 如果将list1中的氨基酸与list2进行比较:从氨基酸字典中查找list2对应的氨基酸。 一个。如果氨基酸相同则 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

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

你需要这样的东西:

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

@Ben 的回答很不错。还有两件事。您的 aminoacid 字典有误。其中一个甘氨酸密码子是CGT,应该是GGT。也代替条件

if len(value1) == 3:

您可能想使用

if value1 in aminoacid.keys():

它直接测试您的三联体是否在允许的密码子集中。如果你有 '7&D' 作为三连音,上面的变体也是正确的。