子类str在python中覆盖__eq__以使用set.intersection

时间:2015-05-14 20:54:13

标签: python string set subclass

我在python中编写了一个python脚本来创建两个集合。我试图在字符串类中覆盖 eq ,所以相同的逻辑是如果字符串a在字符串b中,那么"等于"湾我继承str类,这两个包含新类。 然后我尝试使用set.intersect来获得结果。但结果总是显示0.我的代码是这样的:

# override str class method__eq__
class newString(str):
    def __new__(self, origial):
        self.value = origial
        return str.__new__(self, origial)

    def __eq__(self, other):
        return other.value in self.value or self.value in other.value

    def __ne__(self, other):
        return not self.__eq__(other)

    def __hash__(self):
        return 1

def get_rows():
    lines = set([])
    for line in file_handler:
        lines.add(newString(line.upper()))
    unique_new_set = lines.intersection(columb)
    intersection_new_set = lines.intersection(columa)

# open file1 and file2 in append model
A = open(mailfile, 'r+U')
B = open(suppfile, 'r+U')
get_rows(intersection, unique, A, AB, CLEAN)

A.close()
B.close()
AB.close()
CLEAN.close()

1 个答案:

答案 0 :(得分:2)

您不能使用集合来执行此操作,因为您还需要为这两个字符串生成相同的散列值。你不能这样做,因为你必须事先知道 可能存在哪些遏制平等。

来自object.__hash__ documentation

  

由内置函数hash()调用,以及对散列集合成员的操作,包括setfrozensetdict__hash__()应该返回一个整数。 唯一需要的属性是比较相等的对象具有相同的哈希值;建议以某种方式将对象组件的哈希值混合在一起(例如使用exclusive或),这些哈希值也是对象比较中的一部分。

强调我的。

您无法将__hash__的返回值设置为常量,因为这样您就可以将所有值映射到同一个哈希表槽,从而消除了集可能对其他数据结构的所有优势。相反,对于您尝试添加到集合中的任何对象,您将获得无休止的一系列哈希冲突,将O(1)查找转换为O(N)。

集合是错误的方法,因为您的相等性测试不允许将数据划分为正确的子集。如果您有The quick brown fox jumps over the lazy dogquick brown foxlazy dog行,则根据您构建集的方式,您有1到3个唯一值;对于集合,值必须以您将它们添加到集合的任何顺序是唯一的。