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')