簡體   English   中英

Double for循環到Python列表理解

[英]Double for loop to Python list comprehension

我有以下內容(簡化的結構):

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值中為零時返回False。

像這樣:

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

這將打印False響應。 正確(我想要的)。

但是,當我嘗試使用列表理解時:

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

回應

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

不知何故,我得到了最后一項的重復,而我想要完整的列表,然后檢查里面是否有0.0。

我應該怎么做才能“修復”列表理解語句?

嵌套列表的理解可能會有些混亂。 實際上,您實際上需要按照與其替換的for循環相同的順序來編寫它們:

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

如果真的需要測試是否存在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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM