【问题标题】:Comparing a list with a dictionary and producing new list. Length of new list is 1?将列表与字典进行比较并生成新列表。新列表的长度为 1?
【发布时间】:2020-07-10 16:49:38
【问题描述】:

我试图通过将列表 A 中的元素与字典中的 X 元素进行比较来生成列表 B。 List B 应该从 X 和 List A 匹配的字典中生成所有 Y 元素。

这是我的清单和字典(这是 DNA 翻译成蛋白质程序):

tuple = 'gagcatgttggcctggtcctttgctaggtactgtagagcaggtgagagagtgagggggaaggactccaaattagaccagttcttagccatgaagcagagactctgaagccagactacctgggtcccaatcttgggcttggtatttcctcgctgtgtgactctggactgcgccatggggctcagcgacggggaatggcagttggtgctgaacgtctgggggaaggtggaggctgacatcccaggccatgggcaggaagtcctcatcaggctctttaagggtcacccagagactctggagaagtttgacaagttcaagcacctgaagtcagaggacgagatgaaggcgtctgaggacttaaagaagcatggtgccaccgtgctcaccgccctgggtggcatccttaagaagaaggggcatcatgaggcagagattaagcccctggcacagtcgcatgccaccaagcacaagatccccgtgaagtacctggagttcatctcggaatgcatcatccaggttctgcagagcaagcatcccggggactttggtgctgatgcccagggggccatgaacaaggccctggagctgttccggaaggacatggcctccaactacaaggagctgggcttccagggctaggcccctgccgctcccacccccacccatctgggccccgggttcaagagagagcggggtctgatctcgtgtagccatatagagtttgcttctgagtgtctgctttgtttagtagaggtgggcaggaggagctgaggggctggggctggggtgttgaagttggctttgcatgcccagcgatgcgcctccctgtgggatgtcatcaccctgggaaccgggagtggcccttggctcactgtgttctgcatggtttggatctgaattaattgtcctttcttctaaatcccaaccgaacttcttccaacctccaaactggctgtaaccccaaatccaagccattaactacacctgacagtagcaattgtctgattaatcactggccccttgaagacagcagaatgtccctttgcaatgaggaggagatctgggctgggcgggccagctggggaagcatttgactatctggaacttgtgtgtgcctcctcaggtatggcagtgactcacctggttttaataaaacaacctgcaacatctca'

diction = {'aaa': 'LYS', 'aac': 'ASN', 'aag': 'LYS', 'aat': 'ASN', 'aca': 'THR', 'acc': 'THR', 'acg': 'THR', 'act': 'THR', 'aga': 'ARG', 'agc': 'SER', 'agg': 'ARG', 'agt': 'SER', 'ata': 'ILE', 'atc': 'ILE', 'atg': 'MET', 'att': 'ILE', 'caa': 'GLN', 'cac': 'HIS', 'cag': 'GLN', 'cat': 'HIS', 'cca': 'PRO', 'ccc': 'PRO', 'ccg': 'PRO', 'cct': 'PRO', 'cga': 'ARG', 'cgc': 'ARG', 'cgg': 'ARG', 'cgt': 'ARG', 'cta': 'LEU', 'ctc': 'LEU', 'ctg': 'LEU', 'ctt': 'LEU', 'gaa': 'GLU', 'gac': 'ASP', 'gag': 'GLU', 'gat': 'ASP', 'gca': 'ALA', 'gcc': 'ALA', 'gcg': 'ALA', 'gct': 'ALA', 'gga': 'GLY', 'ggc': 'GLY', 'ggg': 'GLY', 'ggt': 'GLY', 'gta': 'VAL', 'gtc': 'VAL', 'gtg': 'VAL', 'gtt': 'VAL', 'taa': '***', 'tac': 'TYR', 'tag': '***', 'tat': 'TYR', 'tca': 'SER', 'tcc': 'SER', 'tcg': 'SER', 'tct': 'SER', 'tga': '***', 'tgc': 'CYS', 'tgg': 'TRP', 'tgt': 'CYS', 'tta': 'LEU', 'ttc': 'PHE', 'ttg': 'LEU', 'ttt': 'PHE'}

这是我的代码:

protlist = []
for i in range(0,Len): # Len is length of tuple
    tu = tuple[3*i:3*i+3]

    if tu in diction:
        for x,y in diction.items():
            if tu == x:
                protlist = [y]
                print(*protlist,end =" ") # This prints each y value in a linear fashion
                break
print(len(protlist))  

这是我的预期输出:

GLU HIS VAL GLY LEU VAL LEU CYS *** VAL LEU *** SER ARG *** GLU SER GLU GLY GLU GLY LEU GLN ILE ARG PRO VAL LEU SER HIS GLU ALA GLU THR LEU LYS PRO ASP TYR LEU GLY PRO ASN LEU GLY LEU GLY ILE SER SER LEU CYS ASP SER GLY LEU ARG HIS GLY ALA GLN ARG ARG GLY MET ALA VAL GLY ALA GLU ARG LEU GLY GLU GLY GLY GLY *** HIS PRO ARG PRO TRP ALA GLY SER PRO HIS GLN ALA LEU *** GLY SER PRO ARG ASP SER GLY GLU VAL *** GLN VAL GLN ALA PRO GLU VAL ARG GLY ARG ASP GLU GLY VAL *** GLY LEU LYS GLU ALA TRP CYS HIS ARG ALA HIS ARG PRO GLY TRP HIS PRO *** GLU GLU GLY ALA SER *** GLY ARG ASP *** ALA PRO GLY THR VAL ALA CYS HIS GLN ALA GLN ASP PRO ARG GLU VAL PRO GLY VAL HIS LEU GLY MET HIS HIS PRO GLY SER ALA GLU GLN ALA SER ARG GLY LEU TRP CYS *** CYS PRO GLY GLY HIS GLU GLN GLY PRO GLY ALA VAL PRO GLU GLY HIS GLY LEU GLN LEU GLN GLY ALA GLY LEU PRO GLY LEU GLY PRO CYS ARG SER HIS PRO HIS PRO SER GLY PRO ARG VAL GLN GLU ARG ALA GLY SER ASP LEU VAL *** PRO TYR ARG VAL CYS PHE *** VAL SER ALA LEU PHE SER ARG GLY GLY GLN GLU GLU LEU ARG GLY TRP GLY TRP GLY VAL GLU VAL GLY PHE ALA CYS PRO ALA MET ARG LEU PRO VAL GLY CYS HIS HIS PRO GLY ASN ARG GLU TRP PRO LEU ALA HIS CYS VAL LEU HIS GLY LEU ASP LEU ASN *** LEU SER PHE LEU LEU ASN PRO ASN ARG THR SER SER ASN LEU GLN THR GLY CYS ASN PRO LYS SER LYS PRO LEU THR THR PRO ASP SER SER ASN CYS LEU ILE ASN HIS TRP PRO LEU GLU ASP SER ARG MET SER LEU CYS ASN GLU GLU GLU ILE TRP ALA GLY ARG ALA SER TRP GLY SER ILE *** LEU SER GLY THR CYS VAL CYS LEU LEU ARG TYR GLY SER ASP SER PRO GLY PHE ASN LYS THR THR CYS ASN ILE SER 390

此代码将在表面上生成正确的列表。但是,当我调用列表的长度时,它会输出为 1。 我尝试用 protlist.append(y) 替换 protlist = [y]。这给出了正确的列表长度和错误的输出。

我也尝试使用 join 函数而不是 ''.join(y) 但这也给出了不正确的列表长度。

如何编辑代码以实现正确的输出和列表长度?谢谢。

【问题讨论】:

  • X是字典的值还是字典的键?
  • 对不起,应该更清楚; x 是键,y 是值
  • 我们可以看看您的lists 和dict 的示例,以及您的预期输出吗?
  • 嗨 - 现在刚刚将这些添加到我的问题中,谢谢。

标签: python python-3.x list for-loop if-statement


【解决方案1】:

您得到len(protlist) = 1,因为您为for x,y in diction.items() 中的每个循环重新分配了一个值protlist。 然后,用protlist.append(y) 替换protlist = [y] 会得到错误的输出,因为您在每个循环中都打印protlist

不过,首先,Len 的长度不应是 tuple 的长度。元组的长度是1170,但在每个循环中tu 有三个字符,然后你继续接下来的三个。因此,您需要 1170 / 3 = 390 迭代才能到达字符串的末尾。

那么有很多方法可以解决您的问题。像您提到的带有列表和连接的示例是在循环中附加值,然后在循环外进行打印和计数。

protlist = []

for i in range(0, int(len(tuple) / 3)):
    tu = tuple[3*i:3*i+3]
    if tu in diction:
        for x, y in diction.items():
            if tu == x:
                protlist.append(y)
                break

print(' '.join(protlist)) #prints list items separated by a space
print(len(protlist))

我根据您的预期输出对此进行了测试,它给了我准确的结果。

编辑: 此问题的类似简化版本的列表理解示例:

string = 'aaabbbcccdddeee'
dictionary = {'aaa': 'A', 'bbb': 'B', 'ccc': 'C', 'ddd': 'D', 'eee': 'E'}

parts = [ string[i:i+3] for i in range(0, len(string), 3) ]
output = [ dictionary[x] for x in parts if x in dictionary.keys() ]
print(' '.join(output))

【讨论】:

  • 非常感谢您的回答!这非常有帮助;欣赏它:)
  • 不客气。如果你不熟悉列表推导,你可能会觉得研究起来很有趣,它可以帮助压缩你的代码并使某些部分更容易理解。我将编辑我的答案并添加一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多