2016-11-10 6 views
0

私はPython 2.7で次のループを持っています。Pythonは、多変数関数出力のためにリスト内包を持つループをネストしました。

pressure = []; cycle_flow = []; gauge_val = [] 
for element in readout_list: 
    if element.endswith('.dat'): 
     v1_2_3 = extract_sensor_values(element) 
     pressure.append(v1_2_3[0]) 
     cycle_flow.append(v1_2_3[1]) 
     gauge_val.append(v1_2_3[2]) 

私はこれをリスト内包として1行に書いています。機能extract_sensor()は、1つの変数のみを返された場合、私は簡単に、このリストの内包表記を使用することができます。

v1_2_3=[extract_sensor_values(element) for element in readout_list if element.endswith('.dat')] 

はしかし、私は、リストの内包表記を使用して、関数から同時に三つの変数を取得する方法を確認していません。これは複数の行を使用するとシンプルなように見えますが、1行に置いてみるとうまくいきません。

複数の関数値をリスト内包に戻すことはできますか?

+0

また、「コードの行数が少ない」とは、盲目的に目的とする指標ではありません。言語の表現力を使って複雑なものを少ない行で書くことができることは時々ありますが、人々が1行であまりにも多く詰まって悲しみに陥ることはほとんどありません。 – mgilson

+0

私は同意します。これがどのようになるかを以下に見ていきます。この特定のケースでは、簡単に読みにくくすることなく、実際には1ライナーが可能ではない可能性があります。 –

答えて

5

これは、リスト内包表記が作成するタスクの種類ではありません。あなたのコードの各リストの理解は、ちょうど1つのリストを生成する必要があります。あなた

ことの一つは、

triples = [extract_sensor_values(element) 
      for element in readout_list if element.endswith('.dat')] 
pressure, cycle_flow, guage_val = zip(*triples) 

注意の言葉... pressurecycle_flowguage_valトリプルを取得し、その結果を「転置」にzipを使用するリスト内包表記を使用している可能性がありますただし、pressurecycle_flowguage_valという変数(listの代わりに元のコード)ではtupleになります。

+0

正しいとしたら、[pressure、cycle_flow、guage_val]で 'for x 'で終えることができます:list(x)' - これは3つすべての変数のリストを返します。これは1ライナーではありませんが、2行を含みますが、それは私のために働きます。なぜリストの理解はここで適切ではないのですか? –

+0

@WR - リスト内包は単純な変換であるためです。入力iterableを出力リストに変換します。入力iterableを任意の数の出力リストに変換するようには設計されていません。私は根本的な問題は、誰もがそれをはっきりとさせる構文を考えていないということだと思います。 _clearly_を実行するための構文は存在しない可能性が高いですが、誰もまだ時間を費やすのに十分なプレッシャーを感じていない可能性があります。 – mgilson

関連する問題