Python 消除3个字符字符串中的最后一个元素

Python 消除3个字符字符串中的最后一个元素,python,python-3.x,Python,Python 3.x,我需要帮助让这个程序获取一个DNA序列,并将其分解为3s(ATGCGTGGC=>ATG、CGT、CCG)以创建密码子。然后,它会将该密码子与我代码中的“基因编码”字典进行比较。它似乎工作得很好,直到它到达最后一行的末尾,其中一个“G”导致程序失败,因为它与'genecode'字典中的3个字符长的字符串不匹配。基本上,最终的解决方案是消除序列末端小于3的所有字母(核苷酸) 代码如下: genecode = { 'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M'

我需要帮助让这个程序获取一个DNA序列,并将其分解为3sATGCGTGGC=>ATG、CGT、CCG)以创建密码子。然后,它会将该密码子与我代码中的“基因编码”字典进行比较。它似乎工作得很好,直到它到达最后一行的末尾,其中一个“G”导致程序失败,因为它与'genecode'字典中的3个字符长的字符串不匹配。基本上,最终的解决方案是消除序列末端小于3的所有字母(核苷酸)

代码如下:

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

Gene1=open("HBB Norm.csv", "r")        
Gene2=open("HBB Pos (Sickle Cell).csv", "r")

##HBB Norm and HBB Pos (Sickle Cell) are just the names of the csv files I want to import data from 

Gene_1=Gene1.read()
Gene_11=''.join(Gene_1.splitlines())
Gene_2=Gene2.read() 
Gene_22=''.join(Gene_2.splitlines())

for codon in range(0,len(Gene_11),3):  
  gene_11=Gene_11[codon:codon+3]
  print(genecode[gene_11])

显示的具体错误是:

    Traceback (most recent call last):
    File "main.py", line 111, in <module>
    print(genecode[gene_11])
    KeyError: 'G'
回溯(最近一次呼叫最后一次):
文件“main.py”,第111行,在
打印(基因编码[基因11])
KeyError:'G'

非常感谢你的帮助

您可以使用
get
从字典中获取值,而不是索引,并提供一个默认值。我不知道核苷酸是什么,但我想您这里指的是空字符串

print(genecode.get(gene_11, ""))
具体地说,您得到错误是因为字典中没有键
'G'
的值。因此,在打印之前,您可以随时检查密钥是否在字典中

print(genecode[gene_11] if gene_11 in genecode else "")

问题是字符串不是3的倍数。如果您的字符串是ATAAC,您将首先检查ATA和getI,但AC将不在您的列表中。要解决此问题,您可以更改所需的时间:

for codon in range(0, len(Gene_11) - len(Gene_11)%3, 3):

嘿,这基本上就是我要找的。非常感谢!我认为理想情况下,如果长度小于3个字母,我希望程序消除字母的最后一次迭代。但就我而言,我认为这个答案是完全正确的,因为并非所有的字母(核苷酸)都需要转录成密码子。非常感谢@nlsn243很高兴能帮忙!你能接受这个问题的答案吗?