擅长:python、mysql、java
<p>一般来说,以pythonical的方式做这类事情意味着你试图让你的代码不在乎被赋予了什么,至少不会比它真正需要的更多。在</p>
<p>让我们以您的union-find算法为例。union-find算法对传递给它的值的唯一实际操作是比较它们是否相等。因此,要生成一个通常有用的<code>UnionFind</code>类,代码不应该依赖于它接收到的值,而不是进行相等性测试。特别是,您不应该依赖于能够为值分配任意属性。在</p>
<p>我建议解决这个问题的方法是让<code>UnionFind</code>使用包含给定值和使算法工作所需的任何属性的包装器对象。您可以按照另一个答案的建议使用<a href="http://docs.python.org/2/library/collections.html#collections.namedtuple" rel="nofollow">^{<cd3>}</a>,或者制作一个小的包装类。当一个元素被添加到<code>UnionFind</code>时,首先将其包装在其中一个对象中,并使用包装器对象存储属性<code>leader</code>、<code>size</code>等。访问被包装的对象的唯一时间是检查它是否等于另一个值。在</p>
<p>实际上,至少在这种情况下,可以安全地假设值是散列的,这样就可以在Python字典中使用它们作为键来查找与给定值对应的包装器对象。当然,并不是Python中的所有对象都必须是散列的,但是那些不属于散列的对象相对较少,要制作一个能够处理这些对象的数据结构还需要大量的工作。在</p>