2017-02-08 7 views
2

実際に何もしない特別なキーを辞書に割り当てる方法はありますか?そのような私が実行したときにことを今ここに辞書にキーを挿入しない特別な値はありますか?

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

私はキーのいくつかの「特別な」値をしたい:

は、私のような何かをしたい

mydict[key] = value 

それが実際に何もしません、そうmydictは{ 'FOO': 'バー'}ままである(余分なキーまたは値は添加しない)

私が使用してみました:

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

私はこれが必要な理由:

まあ、それは最初のケースを処理するために、基本的にですが。

Iは実際FASTAフォーマットのファイルを有する:

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

私のアプローチは、次のキーが発見されるまで(ライン>で始まる)配列にラインを連結、ライン毎に読み取ることです。 次に、関連付けられた値(シーケンス)を持つキー(id)を辞書に保存し、キーを更新して次のシーケンスの累積を開始します。

もちろん、最初のケース(きれいなアプローチではないと思います)を処理する専用のコード(繰り返し)を持つことができます。または、各ライン(毎回実行する)を読み取るループ内にifを含めることができます。

idが見つかるたびに最もきれいな方法があります。累積seqを持つ前のidを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 

あなたが見ることができるように、このコードでは最初の行は、{「」}なし値を挿入します。

私は当然このキーを削除することができますが、実行時に何も挿入しない初期値を持つことができるかどうかは疑問です。

提案がありますか?

+3

をポイントは何ですか?なぜか:最初の場所に挿入しないでください: 'idがNoneでない場合:mydict [id] = seq' –

+0

実際にはオプションですが、後で削除する必要のある無駄なものを挿入することを意味します。私はちょうどこれを行うための "クリーナー"の方法があるのだろうかと思っています。 –

+0

提案された 'if'は、キーを持つ行が見つかるたびに実行されるためです。数百万の鍵を持つファイルでは、最初のケースを処理するたびに条件を実行します。 –

答えて

3

はもちろん行うことができます。その後、

id = None 

:あなたはifテストを行わずに挿入を回避したい場合、あなたはまた、開始時に非ハッシュ可能値を使用することができます

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

id = [] 

「unhashable exception」をキャッチします。これはうまくいくかもしれませんが、例外は1回だけトリガされるため余分なオーバーヘッドはありません。

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

:速度は、あなたの関心事であるならば、

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

だけで恐ろしくunderperformantある文字列の連結を使用しないでください。代わりに:

  • seqlistとして定義:seqからseq = []
  • アペンドライン:最後にseq.append(line.rstrip('\n'))
  • は、最終的な文字列を作成します。seq = "".join(seq)
関連する問題