【问题标题】:using yield print output使用产量打印输出
【发布时间】:2017-06-25 21:21:59
【问题描述】:

这是here的延续。

我使用的是yield 语句而不是return

这是代码:

class Measurements():
    def __init__(self, value, other):
        self.value = value
        self.other = other


class Criteria():
    def __init__(self, new_value, measurements):
        self.new_value = new_value
        self.measurements = measurements

    def method(self):
        for measurement in self.measurements:
            if 20 < measurement.value < 110:
                measurement.value = self.new_value
        return self.measurements

class Evaluate():
    def __init__(self, criteria):
        self.criteria = criteria

    def execute(self):
        for c in self.criteria:
            c.method()
            yield c.measurements


def main():
    criteria = [
        Criteria(999, [Measurements(100, 0.3), Measurements(33, 0.5)]),
        Criteria(999, [Measurements(150, 0.3), Measurements(35, 0.5)]),
    ]

    compare =  [
        Measurements(999, 0.3), Measurements(999, 0.5),
        Measurements(100, 0.3), Measurements(999, 0.5)
    ]

    obs = Evaluate(criteria).execute()

    # here compare

if __name__ == "__main__":
    main()

我想将obs 的输出值与compare 中的值进行比较。我指的是Measurements 部分。

所以,从obs,我们有(对于运行代码后的变量值):999,999,150,999(因为如果 20

compare 我们有:999,999,100,999

【问题讨论】:

  • 从什么继续?实际的问题或问题是什么?
  • @ChristophTerasa:我编辑过,但无论如何它是独立的。
  • 您想如何比较它们? obs 是一个生成器,因此您可以遍历这些值。
  • “我想将 obs 的输出值与比较中的值进行比较”。请解释为什么list(obs) == compare 不能满足您的需求。
  • @scytale:是的,我尝试使用 for 循环和 enumerate 但我想不通

标签: python yield


【解决方案1】:

仍然有点不确定您要执行哪些检查,但这里有一个示例可以帮助您入门。进行了一些更改

# Made compare a list contain lists of Measurements to match criteria
compare =  [
    [Measurements(999, 0.3), Measurements(999, 0.5)],
    [Measurements(100, 0.3), Measurements(999, 0.5)]
]

# Added __repr__ method to Measurement class
def __repr__(self):
    return '{0} {1}'.format(self.value, self.other)

我建议每当你有一个类实例列表时都这样做,它使调试更容易,因为你得到的不是这个,而是更有意义的东西。

<__main__.Measurements object at 0x0000000003E2C438>

现在比较值,我使用zip 将两个列表组合在一起,以便更容易比较值。然后对于内部 for 循环,我们再次将每个组中的嵌套列表压缩在一起。从这里开始,每个项目都是一个测量值,我们可以检查它们的值。

for crit_lst, comp_lst in zip(obs, compare):
    for crit_meas, comp_meas in zip(crit_lst, comp_lst):
        print(crit_meas, comp_meas)
        if crit_meas.value != comp_meas.value: # example of comparing their values
            print('Mis-Match', crit_meas.value, comp_meas.value)

【讨论】:

  • 谢谢!这正是我想要的。(赞成)
【解决方案2】:

我不知道你是否真的需要你的 Measurements 的二维结构,这会在 numpy.如果没有必要,您可以删除额外的维度。

import numpy as np

lower = 20
upper = 110

meas = np.array([[[100, 0.3], [33, 0.5]], [[150, 0.3], [35, 0.5]]])
crit = np.array([[999, 999]])
comp = np.array([[[100, 0.3], [33, 0.5]], [[150, 0.3], [35, 0.5]]])

mask = (meas[:,:,0] > lower) * (meas[:,:,0] < upper)

meas[mask,0] = (mask * crit)[mask] # apply mask to inner first column

out = (meas == comp).all(axis=2) # compare each measurement to respective one in comp

print(out)

这给出了:

[[False False]
 [ True False]]

【讨论】:

  • 谢谢,很好的解决方案,但不是我现在正在寻找的(赞成)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多