2016-07-18 23 views
1

私は1,000ファイルを持っています。Pythonを使ったif文を使った単純なラムダ関数

!dataset_description = Analysis of POF D119 mutation. 
!dataset_type = Expression profiling by array 
!dataset_pubmed_id = 17318176 
!dataset_platform = GPL1322 

目的:各ファイルの先頭全てがこのようになり、私はすべてのファイルとの間にExcelのスプレッドシートを作ることができるので、リストにこの情報を変換したいです。つまり私は、リストには、次のようになりたい:

[Analysis_of_POF_D119_mutation,Expression_profiling_by_array,17318176,GPL1322] 

私はこのコードを持って、これはちょうど最初の変数、「dataset_descriptionを!」抽出することである(ただし、私はその後、金利すなわち、各変数上でコードを実行します!dataset_type、dataset_pubmed_id、dataset_platform):!! "pythonically"

OpenDataset = open(sys.argv[1], 'r') 
Dataset = OpenDataset.readlines() 
ListOfInformation = [] 
    formatted_line = lambda x: "_".join(line.strip().split("=")[x].split()) 
    for line in Dataset: 
     if line.startswith("!dataset_description"): 
      description = formatted_line(1) 
      print description 

コードの作品は、しかし、私はPythonの基本を理解する段階になりました、と私はより多くのコーディングを開始します。私には2つの質問があります。

  1. 私が使用しているラムダ式を使用するのは愚かなようです。ラムダ式の "x"は常に "="記号の後に来るものが必要なので、常に1になります。したがって、xは実際には「変数」ではありませんが、変数なしでラムダ式を持つことはできません。

    formatted_line = lambda x: "_".join(line.strip().split("=")[1].split()) if line.startswith(x) 
    

    しかし、このコードは構文エラーを返します。行はこのような何かをやって、真の可変である、で始まる何

は、私はあることに、変数を変更しようとしました。

誰かが上記のラムダ式を動作させる方法を知っていますか?

  1. これらのファイルは、実際には非常に大きな可能性があります。しかし、私が必要とする情報はファイルの先頭にあり、すべては "!"で始まります。シンボル。ですから、ファイルの先頭にX個の行が必要なときに、ファイル全体を読むのはばかげているように思えます。すべての行は "!"で始まります。 (1ファイルあたりの正確な行数は可変です)。 "!"で始まる行だけを読む方法はありますか?または単にfile.readlines()を使用する方が速いです。
+1

なぜあなたは常に '1'渡していますか?代わりに 'line'を渡してください。 – thefourtheye

+2

"私は変数なしでラムダ式を持つことはできません" - 確かにできます。変数に入れないでください。 – khelwood

+0

Lambdaの "式"は他の式と同じように値を生成する必要があります。最後の 'lambda'バージョンでは、行が' x'で始まらない場合、式の結果はどうなりますか?そのため、構文エラーが発生します。 – thefourtheye

答えて

2

あなたは確かに引数なしでラムダ式を持つことができます。

しかし、この場合、実際には引数、つまり行自体を渡す必要があります。それがあなたが操作しているものなので、関数に渡す必要があります。

ifの文が動作しない理由は、Pythonのインラインifはで、常ににelse句が必要なためです。この場合、elseの値は空の文字列です。 !

ので:あなただけの行が始まる停止するまでの値を読みたい場合は

formatted_line = lambda line: "_".join(line.strip().split("=")[1].split()) if line.startswith(x) else "" 

、あなたはitertools.takewhile使用することができます:それはSyntaxErrorを提起

from itertools import takewhile 
... 
for line in takewhile(lambda line: line.startswith("!"), Dataset): 
2

、あなたが不足しているため、 elseブランチ。 "if if"または "inline if"の構文は次のとおりです。<value to return when True> if <condition> else <value when False>elifは使用できません。

ので、コードは次のようになります。

formatted_line = lambda x: "_".join(line.strip().split("=")[1].split()) if line.startswith(x) else "" # You can replace this with `None`. 
関連する問題