【发布时间】:2019-01-14 13:34:18
【问题描述】:
我有两个对象列表。我们将列表称为 a 和 b。对象(出于我们的意图和目的)定义如下:
class MyObj:
def __init__(self, string: str, integer: int):
self.string = string
self.integer = integer
def __eq__(self, other):
if self.integer == other.integer:
pass
else:
return False
if fuzz.ratio(self.string, other.string) > 90: # fuzzywuzzy library checks if strings are "similar enough"
return True
else:
return False
现在我想要实现的是检查列表 a 中的哪些对象“在”列表 b 中(与列表 b 中的某些对象相比,返回 true 反对 ==)。
目前我只是按如下方式遍历它们:
for obj in a:
for other_obj in b:
if a == b:
<do something>
break
我强烈怀疑有更快的方法来实现这一点。名单很长。每个最多 100 000 个对象。所以这是我代码中的一大瓶颈。
我查看了这个答案Fastest way to search a list in python,它表明套装效果更好。不过,我对此有点困惑:
“删除重复项”加速有多大意义?我不希望我的列表中有很多重复项。
当我按照我的方式定义 eq 时,集合可以删除重复项并正确散列吗?
- 这与预先排序列表和使用二分搜索之类的方法相比如何?一个集合是无序的...
那么这里最好的方法是什么?请在答案中提供实施指南。
【问题讨论】:
-
我从第一个代码块中得到了一些语法错误。
def MyObj:是指class MyObj:吗?continue,你的意思是pass吗? -
是的对不起现在编辑
-
您不能基于字符串进行散列。两个相等的对象必须具有相同的哈希值。