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 附加到字典中的列表的主要内容,如果未能解决你的问题,请参考以下文章

将字典附加到循环中的列表

将项目附加到字典 Python

将值附加到字典中的一个列表 将值附加到字典中的所有列表

如何将字符串附加到字典中的列表

添加将字典附加到另一个 multiprocessing.managers.DictProxy 中的列表

Python函数,用于组织lis,字典中的值