双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.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]
在LC的循环是不正确的顺序。 – 2015-03-02 11:30:17