Python Counter对象的求和计算,我们需要根据轮换和类型计算缺陷的概率。为了计算预期的概率,需要首先进行简单的求和。下面对所有缺陷的值进行求和,可以通过执行以下命令计算得到:
total = sum(defects.values())
这是直接从赋给defects
变量的Counter
对象中计算得到的,会显示样本集中共有309个缺陷。
还需要通过轮换和类型来获取缺陷,这意味着需要从原始缺陷数据中提取两种子集。按轮换提取将只使用Counter
对象中(shift,defect type)
键的前半部分,按类型提取则使用键值对的后半部分。
可以从赋值给defects
变量的初始Counter
对象集合中提取并创建额外的Counter
对象来进行汇总。按轮换汇总如下所示:
shift_totals = sum(
(Counter({s: defects[s, d]}) for s, d in defects),
Counter() # start value = empty Counter
)
这样就创建了单独的Counter
对象集合。这些对象都具有一个轮换s
作为键,以及相应的缺陷计数defects[s,d]
。生成器表达式会创建12个这样的Counter
对象用于从4种缺陷和3种轮换的所有组合中提取数据。可以使用sum()
函数来组合Counter
对象,以此获得按轮换组织的3组汇总信息。
对于
sum()
函数,不能使用默认的初始值0,必须提供一个空的Counter()
对象作为初始值。
创建类型汇总的表达式类似于创建轮换汇总的表达式。
type_totals = sum(
(Counter({d: defects[s, d]}) for s, d in defects),
Counter() # start value = empty Counter
)
使用缺陷类型d
而不是轮换类型作为键,创建了十余个Counter
对象,否则结果会一样。
轮换总计如下:
Counter({'3': 119, '2': 96, '1': 94})
缺陷类型总计如下:
Counter({'C': 128, 'A': 74, 'B': 69, 'D': 38})
将汇总结果保存为Counter
对象,而不是创建简单的dict
对象,甚至list
实例。之后通常会将它们作为普通字典来使用,然而在某些情况下,需要合适的Counter
对象而非精简的字典对象。