我试图通过比较列表A中的元素和字典中的X元素来生成一个列表B。列表B应该从字典中生成所有Y元素,其中X和List A匹配。
这是我的清单和字典(这是一个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),但这也给出了列表的不正确长度。
如何编辑代码以实现正确的输出和列表长度?谢谢。
发布于 2020-03-30 15:44:38
获得len(protlist) = 1是因为为for x,y in diction.items()中的每个循环重新分配单个值为protlist。然后,用protlist = [y]替换protlist.append(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))https://stackoverflow.com/questions/60928504
复制相似问题