我在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()
答案 0 :(得分:2)
您不能使用集合来执行此操作,因为您还需要为这两个字符串生成相同的散列值。你不能这样做,因为你必须事先知道 可能存在哪些遏制平等。
来自object.__hash__
documentation:
由内置函数
hash()
调用,以及对散列集合成员的操作,包括set
,frozenset
和dict
。__hash__()
应该返回一个整数。 唯一需要的属性是比较相等的对象具有相同的哈希值;建议以某种方式将对象组件的哈希值混合在一起(例如使用exclusive或),这些哈希值也是对象比较中的一部分。
强调我的。
您无法将__hash__
的返回值设置为常量,因为这样您就可以将所有值映射到同一个哈希表槽,从而消除了集可能对其他数据结构的所有优势。相反,对于您尝试添加到集合中的任何对象,您将获得无休止的一系列哈希冲突,将O(1)查找转换为O(N)。
集合是错误的方法,因为您的相等性测试不允许将数据划分为正确的子集。如果您有The quick brown fox jumps over the lazy dog
,quick brown fox
和lazy dog
行,则根据您构建集的方式,您有1到3个唯一值;对于集合,值必须以您将它们添加到集合的任何顺序是唯一的。