2015-03-02 462 views
1

我有以下(簡化結構):雙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

回答

2

如果測試的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]) 
2

嵌套列表推導可能有點混亂。實際上,你需要將它們寫在同一順序的for循環替換他們:所以它應該是

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