双循环到 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
值之一为零时 returns 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
响应
[5.0, 5.0, 5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0]
True
不知何故,我得到了最后一项的重复,而我想要完整的列表,然后检查里面是否有 0.0。
我应该如何处理 'repair' 列表理解语句?
嵌套列表理解可能有点令人困惑。您实际上需要按照与它们替换的 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])
我有以下(简化结构):
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
值之一为零时 returns 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
响应
[5.0, 5.0, 5.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0]
True
不知何故,我得到了最后一项的重复,而我想要完整的列表,然后检查里面是否有 0.0。
我应该如何处理 'repair' 列表理解语句?
嵌套列表理解可能有点令人困惑。您实际上需要按照与它们替换的 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])