是否有特殊值不会在字典中插入密钥

时间:2017-02-08 17:41:21

标签: python dictionary fasta

有没有一种方法可以为字典分配一个实际上什么都不做的字符?

我想做类似的事情:

mydict = {}
key, value = 'foo', 'bar'
mydict[key] = value   % now my dict has {'foo': 'bar'}

现在我想要一些"特别" key的值,这样当我运行时:

mydict[key] = value

它实际上并没有做任何事情,所以mydict仍然是{' foo':' bar'}(没有额外的键或值添加)

我尝试使用:

d[None] = None   # It actually adds {None: None} to the dict
d[] = []         # Invalid syntax

为什么我需要这个:

基本上它可以处理一个初始案例。

我有一个实际上是FASTA格式的文件:

>id_3362
TGTCAGTGTTCCCCGTGGCCCTGCGGTTGGAATTGCAGCGGGTCGCTTTAGTTCTGGCAT
ATATTTTGACGGTGCCGGCCGGCGATACTGACGTGTGAGGACTTGAATTTGTACCAGCGC
AACACTTCCAAAGCCTGGACTAGGTTGT
>id_4743
CGGGGGATCTAATGTGGCTGCCACGGGTTGAAAAATGG
>id_5443
ATATTTTGACGGTGCCGGCCGGCGATACTGACGTGTGAGGACTTGAATTTGTACCAGCGC
AACACTTCCAAAGCCTGGACTAGGTTGT

我的方法是逐行读取,将行连接成一个序列,直到找到下一个键(以>开头的行)。 然后我将密钥(id)与相关值(序列)保存在字典中,更新密钥并开始累积下一个序列。

当然我可以有一个处理第一种情况的专用代码(重复)(我认为它不是一种干净的方法)或者我可以在循环中找到if来读取每一行(每次都会执行)

所以最干净的方法是每次找到一个id,将前面的id与累积的seq保存到dictionay,但是为了处理第一行,我需要一些特殊的值。

这是我的代码:

def read_fasta(filename):
    mydict = {}
    id = None      # this has to be the special character I'm looking for
    seq = ''

    with open(filename) as f:            
        for line in f:
            if line[0] == '>':
                mydict[id] = seq             # save current id and seq
                id = line[1:].rstrip('\n')   # update id
                seq = ''                     # clean seq
            else:
                seq += line.rstrip('\n')     # accumulate seq

如您所见,在此代码中,第一行会将值{None:''}插入字典。

我当然可以在最后删除此密钥,但我想知道我是否可以拥有一个在执行时不会插入任何内容的初始值。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

你当然可以这样做:

id = None

然后:

if id is not None: mydict[id] = seq

如果你想避免在没有if测试的情况下插入,你也可以在开始时使用不可散列的值。

id = []

然后抓住“不可避免的异常”。这会起作用,虽然很难看,但没有额外的开销,因为异常只被触发一次。

   try:
      mydict[id] = seq
   except TypeError:
      pass

除此之外:如果您关注速度,请不要使用字符串连接

seq += line.rstrip('\n')

只是非常糟糕的表现。代替:

  • seq定义为listseq = []
  • 将行添加到seqseq.append(line.rstrip('\n'))
  • 最后创建最终字符串:seq = "".join(seq)