Python 是否有一个特殊值不';不要在字典里插入一个键

Python 是否有一个特殊值不';不要在字典里插入一个键,python,dictionary,fasta,Python,Dictionary,Fasta,有没有一种方法可以为实际上什么都不做的字典分配一个特殊的键 我想做一些类似的事情: mydict = {} key, value = 'foo', 'bar' mydict[key] = value % now my dict has {'foo': 'bar'} 现在,我需要一些键的“特殊”值,以便在运行时: mydict[key] = value 它实际上什么都不做,所以mydict仍然是{'foo':'bar'}(没有添加额外的键或值) 我尝试使用: d[None] = None

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

我想做一些类似的事情:

mydict = {}
key, value = 'foo', 'bar'
mydict[key] = value   % now my dict has {'foo': 'bar'}
现在,我需要一些键的“特殊”值,以便在运行时:

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保存到字典中,但要处理第一行,我需要一些键的特殊值

这是我的密码:

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:''}

我当然可以在最后删除这个键,但我想知道是否可以有一个初始值,在执行时不插入任何内容


有什么建议吗?

您当然可以:

id = None
然后:

如果要避免在未进行
If
测试的情况下插入,还可以在开始时使用不可散列的值

id = []
然后捕捉“不可破坏的异常”。这会起作用,虽然很难看,但不会产生额外的开销,因为异常只会触发一次

   try:
      mydict[id] = seq
   except TypeError:
      pass
旁白:如果你关心速度,那么不要使用字符串连接

seq += line.rstrip('\n')
只是表现糟糕得可怕。相反:

  • seq
    定义为
    列表
    seq=[]
  • 将行追加到
    seq
    seq.append(line.rstrip('\n'))
  • 最后创建最后一个字符串:
    seq=”“.join(seq)

这有什么意义?为什么不:首先不插入它:
如果id不是None:mydict[id]=seq
它实际上是一个选项,但它意味着插入一些以后必须删除的无用内容。我只是想知道是否有一种“更干净”的方法可以做到这一点。因为每次找到一行带键的代码时,建议的
if
都会执行。在一个包含数百万个键的文件中,您每次都会执行条件语句,只是为了处理一个初始情况。@SembeiNorimaki FWIW,在整个代码生命周期中,您可以通过避免使用一个
(如果
)来节省的任何时间与您不使用的时间相比都可以忽略不计。构建字典只需要一行代码:
{rec.id:str(rec.seq)for rec in SeqIO.parse(“test.fasta”,“fasta”)}
,您可以轻松完成无数其他事情。
seq += line.rstrip('\n')