2016-06-20 7 views
0

ここで辞書の理解はどうなっていますか?フィルタオブジェクトの辞書の理解

私はBLASTファイルを解析しており、ファイル内の各行にオブジェクトを作成したいとします。理想的には、各オブジェクトは、後でプログラムで使用するために辞書に格納されます。 解析は正常ですが、私は空のtransSwiss辞書になります。私は、各BLASTラインparse_blastオブジェクト作成しようとしている

c0_g1_i1|m.1 gi|74665200|sp|Q9HGP0.1|PVG4_SCHPO 100.00 372 0 0 1 372 1 372 0.0 754 
c1000_g1_i1|m.799 gi|48474761|sp|O94288.1|NOC3_SCHPO 100.00 747 0 0 5 751 1 747 0.0 1506 
c1001_g1_i1|m.800 gi|259016383|sp|O42919.3|RT26A_SCHPO 100.00 268 0 0 1 268 1 268 0.0 557 
c1002_g1_i1|m.801 gi|1723464|sp|Q10302.1|YD49_SCHPO 100.00 646 0 0 1 646 1 646 0.0 1310 

:ここ

は、一例として、出力の数行です。

class parse_blast(object): 

    def __init__(self, line): 

     #Strip end-of-line and split on tabs 
     self.fields = line.strip("\n").split("\t") 
     self.transcriptId, self.isoform = self.fields[0].split("|") 
     self.swissStuff = self.fields[1].split("|") 
     self.swissProtId = self.swissStuff[3] 
     self.percentId = self.fields[2] 

    def filterblast(self): 
     return float(self.percentId) > 95 



blastmap = map(parse_blast, blast_output.readlines()) 

filtered = filter(parse_blast.filterblast, blastmap) 

transSwiss = {blastmap.transcriptId:blastmap for blastmap.transcriptId in filtered} 
+0

、あなたの 'percentId'は、文字列ではなく、' int'です。あなたは本当にここでクラスを使う必要はありませんが、これはかなり混乱します。指摘したように、あなたはまた、あなたのdictの理解のローカル変数を上書きしようとしています。 –

+0

正解、percentIdは文字列です。また、これは私のプログラム全体ではなく、現在私が問題を抱えている部分だけです。 – Chris

答えて

2

あなたが行うと、この:あなたは順番にblastmap.transcriptIdfilteredの各要素を割り当てるしようとしている

for blastmap.transcriptId in filtered 

blastmapは、mapタイプのリストまたはインスタンスのいずれかで、PythonのバージョンによってはtranscriptId属性がなく、コードにはAttributeErrorが指定されていません。

変数を使用します。 新しい変数:推測として

transSwiss = {pb.transcriptId: pb for pb in filtered} 
+0

おかげで、ありがとう。だから、これはPython 3で新しいオブジェクトが実際に作成されている(インスタンス化されているかのような)のでしょうか? – Chris