双循环到Python列表理解

时间:2015-03-02 11:25:41

标签: python list 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 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。

我应该怎样做才能“修复”列表理解陈述?

2 个答案:

答案 0 :(得分:2)

嵌套列表推导可能有点令人困惑。实际上你需要以与它们替换的for循环相同的顺序编写它们:所以它应该是

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

答案 1 :(得分:2)

如果您真正想要测试0.0的存在,则应使用in运算符。它不仅更具可读性,而且速度更快。然后,您也可以使用any

而不是:

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

DO

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