Python:将 a 附加到字典中的列表
Posted
技术标签:
【中文标题】Python:将 a 附加到字典中的列表【英文标题】:Python: Appending a to a list from a dictionary 【发布时间】:2013-03-27 07:49:42 【问题描述】:这会很长,但我不知道如何有效地解释这一点。
所以我有 2 个正在读取的文件。第一个有一个字符列表。第二个文件是 3 个字符的列表,然后是匹配的标识符字符(由制表符分隔)。
使用第二个文件,我制作了一个字典,其中 3 个字符作为项目,一个字符作为对应的键。 我需要做的是从第一个列表中一次取 3 个字符并将其与字典进行比较。如果有匹配项,我需要获取相应的键并将其附加到我将打印出来的新列表中。如果匹配是 '*' 字符,我需要停止不继续将列表与字典进行比较。
我在比较时遇到问题,然后使用 append 函数制作新列表。
这是第一个输入文件的一部分:
Seq0
ATGGAAGCGAGGATGtGa
这是第二部分:
AUU I
AUC I
AUA I
CUU L
GUU V
UGA *
到目前为止,这是我的代码:
input = open("input.fasta", "r")
codons = open("codons.txt", "r")
counts = 1
amino_acids =
for lines in codons:
lines = lines.strip()
codon, acid = lines.split("\t")
amino_acids[codon] = acid
counts += 1
count = 1
for line in input:
if count%2 == 0:
line = line.upper()
line = line.strip()
line = line.replace(" ", "")
line = line.replace("T", "U")
import re
if not re.match("^[AUCG]*$", line):
print "Error!"
if re.match("^[AUCG]*$", line):
mrna = len(line)/3
first = 0
last = 3
while mrna != 0:
codon = line[first:last]
first += 3
last += 3
mrna -= 1
list = []
if codon == amino_acids[codon]:
list.append(acid)
if acid == "*":
mrna = 0
for acid in list:
print acid
所以我希望我的输出看起来像这样:
M L I V *
但我还没有接近这一点。 请帮忙!
【问题讨论】:
好吧,你似乎从来没有增加“计数”。你有任何输出吗? 【参考方案1】:以下纯属未经测试的代码。检查缩进、语法和逻辑,但应该更接近你想要的。
import re
codons = open("codons.txt", "r")
amino_acids =
for lines in codons:
lines = lines.strip()
codon, acid = lines.split("\t")
amino_acids[codon] = acid
input = open("input.fasta", "r")
count = 0
list = []
for line in input:
count += 1
if count%2 == 0: #i.e. only care about even lines
line = line.upper()
line = line.strip()
line = line.replace(" ", "")
line = line.replace("T", "U")
if not re.match("^[AUCG]*$", line):
print "Error!"
else:
mrna = len(line)/3
first = 0
while mrna != 0:
codon = line[first:first+3]
first += 3
mrna -= 1
if codon in amino_acids:
list.append(amino_acids[codon])
if acid == "*":
mrna = 0
for acid in list:
print acid
【讨论】:
【参考方案2】:在 Python 中,通常有一种方法可以避免使用计数器等编写显式循环。有一种非常强大的列表理解语法,可让您在一行中构建列表。也就是说,这是编写第二个 for
循环的另一种方法:
import re
def codons_to_acids(amino_acids, sequence):
sequence = sequence.upper().strip().replace(' ', '').replace('T', 'U')
codons = re.findall(r'...', sequence)
acids = [amino_acids.get(codon) for codon in codons if codon in amino_acids]
if '*' in acids:
acids = acids[:acids.index('*') + 1]
return acids
第一行执行所有字符串清理。将不同的方法链接在一起使代码对我来说更具可读性。你可能喜欢也可能不喜欢。第二行使用re.findall
以一种巧妙的方式将字符串每三个字符拆分一次。第三行是一个列表解析,它在amino_acids
字典中查找每个密码子并创建一个结果值列表。
没有简单的方法可以打破列表解析中的for
循环,因此最后的if
语句会切掉出现在*
之后的所有条目。
你可以这样调用这个函数:
amino_acids =
'AUU': 'I', 'AUC': 'I', 'AUA': 'I', 'CUU': 'L', 'GUU': 'V', 'UGA': '*'
print codons_to_acids(amino_acids, 'ATGGAAGCGAGGATGtGaATT')
【讨论】:
【参考方案3】:如果不用regex也能解决问题,最好不要用。
with open('input.fasta', 'r') as f1:
input = f1.read()
codons = list()
with open('codons.txt', 'r') as f2:
codons = f2.readlines()
input = [x.replace('T', 'U') for x in input.upper() if x in 'ATCG']
chunks = [''.join(input[x:x+3]) for x in xrange(0, len(input), 3)]
codons = [c.replace('\n', '').upper() for c in codons if c != '\n']
my_dict = q.split()[0]: q.split()[1] for q in codons
result = list()
for ch in chunks:
new_elem = my_dict.pop(ch, None)
if new_elem is None:
print 'Invalid key!'
else:
result.append(new_elem)
if new_elem == '*':
break
print result
【讨论】:
以上是关于Python:将 a 附加到字典中的列表的主要内容,如果未能解决你的问题,请参考以下文章