【发布时间】:2015-01-02 19:47:06
【问题描述】:
提供的所有代码都在 python 3.3 中。
假设我创建了以下 Counter() 对象:
>>> from collections import Counter
>>> g = Counter(a=2, b=5, c=6, d = 3)
>>> g
Counter({'a': 2, 'b': 5, 'd': 3, 'c': 6})
我现在可以通过简单地执行类似的操作来更改计数器中的所有值
>>> g['b']=4
但是,我想检测计数器中的特定值何时更改。发生这种情况时,我希望执行一个函数,然后从 Counter 中增加另一个特定值(如果可以直接执行此操作,无需函数 - 请告诉我)。
例如,如果 'a' 增加,'c' 和 'd' 也应该增加。
背景:
我正在编写一种算法,该算法在字符串中搜索具有某些属性的子字符串,将这些子字符串写入列表,然后在子字符串中搜索更小的子字符串,将它们分配给更高的子字符串。当最终函数然后计算这些子字符串的所有出现时,我不希望它遍历子字符串的每个层次结构,而只需要增加更高的子字符串。附加的回调应该增加所有子子串。
由于我不能一次添加所有回调,如果有一些方法可以将回调添加到运行中的值,那就太好了。
【问题讨论】:
-
您需要继承 Counter,覆盖
__setitem__,然后在那里进行检查。 -
@PadraicCunningham 请阅读上下文。我假设 c 和 d 是 a 的子串。也许我应该说得更清楚一点。
-
@BrenBarn 这是一个很好的解决方案,不幸的是,我需要在一个相当小的脚本中执行此操作,因为我必须将整个源代码添加到具有页数限制的文档中。我根本负担不起将 Counter() 子类化。尽管如此,很好的方法。如果一切都失败了,我会这样做并告诉我的老板我需要更多空间:)
-
@SmeltQuake:你必须这样做。您可以查看 Counter right here 的文档。那里没有关于回调的内容。 Counter 不支持任何开箱即用的东西。如果您在使用
obj[item] = blah设置对象的项目时需要特殊行为,则可以使用__setitem__。 (当然,您也可以编写自己的类来独立于 Counter 来执行此操作,但这并不会减少工作量。)