2016-11-10 21 views
0

我在Python 2.7以下的循环。的Python编写与列表理解嵌套循环的MULT变量函数输出

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

我想写这个列表理解在一行中。如果函数extract_sensor()只返回一个变量然后我可以很容易地使用这个列表理解:

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

但是,我不知道如何从功能同时得到三个变量,使用列表理解。这在使用多行时看起来很简单,但是当我尝试将它放在一行上时,它不起作用。

是否有可能在一个列表理解返回多个函数值?

+0

另外请注意,“更少的代码”是不是力求达到盲目的度量。虽然有时候你可以用语言的表现力来用较少的线条写出复杂的东西,但事实上常见的是,人们在一条线上过多地插入,导致几乎难以理解的悲伤混乱。 – mgilson

+0

我同意。我们将在下面看到结果如何。在这种特殊情况下,很可能会出现单行不可能实现而不易读取的困难。 –

回答

5

这不是那种列表内涵的建立是为了解决的任务。你的代码中的每个列表理解应该产生一个列表。

有一件事你可能是使用列表理解来获得pressurecycle_flowguage_val三倍,然后用zip为“转”的结果......

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

一个忠告但是 - 这将让你与tuplepressurecycle_flowguage_val变量(而不是作为list在你原来的代码)。

+0

正确,然后我就可以用'for [in] in x in [pressure,cycle_flow,guage_val]完成它:list(x)' - 这给了我所有3个变量的列表。这不是一条线,而是涉及2条线 - 但它适用于我。为什么列表理解在这里不合适? –

+0

@WR - 因为列表解析是指简单的变换。它将可迭代的输入转换为输出列表。它不是为了将输入迭代成任意数量的输出列表而设计的。我猜想根本问题是没有人会想到一个能够清楚地完成这个任务的语法。很可能没有明确的语法存在,但我想也有可能没有人认为需要足够的时间来花时间考虑它(还)。 – mgilson