双for循环Python列表理解

双for循环Python列表理解

问题描述:

我有以下(简化结构):双for循环Python列表理解

class Wafer: 
    def __init__(self, df): 
     self.dose_fields = df 

class Data: 
    def __init__(self, add_zero): 
     self.wafers = [] 
     self.wafers.append(Wafer([1.0, 1.5])) 
     self.wafers.append(Wafer([2.0, 2.0])) 
     self.wafers.append(Wafer([3.0, 3.5])) 
     self.wafers.append(Wafer([4.0, 4.5])) 

     if add_zero: 
      self.wafers.append(Wafer([5.0, 0.0])) 

我想有当有在dose_fields值中的一个零返回假的函数。

这样的:

data = Data(True)   
res = True 
for wafer in data.wafers: 
    for fld in wafer.dose_fields: 
     if fld == 0.0: 
      res = False 
print res 

data = Data(False)   
res = True 
for wafer in data.wafers: 
    for fld in wafer.dose_fields: 
     if fld == 0.0: 
      res = False 
print res 

这将打印假RESP。真(我想要的)。

然而,当我尝试使用列表理解:

data = Data(True) 
print [df for df in wafer.dose_fields for wafer in data.wafers] 
print res 

data = Data(False) 
print [df for df in wafer.dose_fields for wafer in data.wafers] 
print res 

我得到的结果

[4.0, 4.0, 4.0, 4.0, 4.0, 4.5, 4.5, 4.5, 4.5, 4.5] 
True 

RESP

[5.0, 5.0, 5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0] 
True 

不知怎的,我得到了最后一个项目的重复,而我想要完整的列表,然后检查内部是否有0.0。

我应该怎么做'修复'列表理解陈述?

+0

在LC的循环是不正确的顺序。 – 2015-03-02 11:30:17

如果测试的0.0存在确实是你想要的,你应该使用in操作。它不仅更具可读性,而且速度更快。然后,您可以使用any,太

相反的:

res = True 
for wafer in data.wafers: 
    for fld in wafer.dose_fields: 
     if fld == 0.0: 
      res = False 

res= not any([0.0 in wafer.dose_fields for wafer in data.wafers]) 

嵌套列表推导可能有点混乱。实际上,你需要将它们写在同一顺序的for循环替换他们:所以它应该是

[df for wafer in data.wafers for df in wafer.dose_fields]