通过哈希查找集合中的项目
Find item in set via hash
如果我知道散列是如何计算的,是否有快速查找集合对象的方法?
我有以下 class,uid
是一个唯一的字符串(从未用于不同的对象两次):
class Foo():
def __init__(self, uid):
self.uid = uid
self.__hash = hash(self.uid)
def __hash__(self):
return self.__hash
def __eq__(self, other):
return self.__hash == other.__hash
我用不同的 uid
创建了一组:
foos = {Foo('a'), Foo('b'), Foo('c')}
我现在想知道,如果我想要使用 b
初始化的项目,是否有比
b_object = next(foo for foo in foos if foo.uid == 'b')
因为我可以获得 hash_b = hash('b')
,如果集合真的很大(在我的特定情况下显然是这种情况),它应该以某种方式提供更快的访问。
我不确定你用它做什么,但你可以这样做:
uid_to_foo = {foo.uid: foo for foo in foos}
# use 'uid_to_foo[some_foo.uid]' to find an instance fast
现在您可以通过 uid
.
快速访问任何 Foo
实例
请注意,您当前的哈希 承诺 没有冲突(尽管它们可能不太可能)。
您甚至可以在 class 本身中使用:
class Foo():
# add class dictionary mapping uids to foos
uid_to_foo = {}
def __init__(self, uid):
self.uid = uid
self.__hash = hash(self.uid)
# add to class-level mapping
Foo.uid_to_foo[uid] = self
def __hash__(self):
return self.__hash
def __eq__(self, other):
return self.__hash == other.__hash
要为每个子 class 创建一个映射,您可以使用 defaultdict
:
做类似的事情(如评论中所问)
class Base():
# add class dictionary mapping uids to instances
uid_to_obj = defaultdict(dict)
def __init__(self, uid):
self.uid = uid
self.__hash = hash(self.uid)
# add specific sub-class mapping for each sub-class
Foo.uid_to_obj[type(self).__name__][uid] = self
def __hash__(self):
return self.__hash
def __eq__(self, other):
return self.__hash == other.__hash
class-specific 词典现在显然在 Foo.uid_to_obj[type(self).__name__]
.
下
如果我知道散列是如何计算的,是否有快速查找集合对象的方法?
我有以下 class,uid
是一个唯一的字符串(从未用于不同的对象两次):
class Foo():
def __init__(self, uid):
self.uid = uid
self.__hash = hash(self.uid)
def __hash__(self):
return self.__hash
def __eq__(self, other):
return self.__hash == other.__hash
我用不同的 uid
创建了一组:
foos = {Foo('a'), Foo('b'), Foo('c')}
我现在想知道,如果我想要使用 b
初始化的项目,是否有比
b_object = next(foo for foo in foos if foo.uid == 'b')
因为我可以获得 hash_b = hash('b')
,如果集合真的很大(在我的特定情况下显然是这种情况),它应该以某种方式提供更快的访问。
我不确定你用它做什么,但你可以这样做:
uid_to_foo = {foo.uid: foo for foo in foos}
# use 'uid_to_foo[some_foo.uid]' to find an instance fast
现在您可以通过 uid
.
Foo
实例
请注意,您当前的哈希 承诺 没有冲突(尽管它们可能不太可能)。
您甚至可以在 class 本身中使用:
class Foo():
# add class dictionary mapping uids to foos
uid_to_foo = {}
def __init__(self, uid):
self.uid = uid
self.__hash = hash(self.uid)
# add to class-level mapping
Foo.uid_to_foo[uid] = self
def __hash__(self):
return self.__hash
def __eq__(self, other):
return self.__hash == other.__hash
要为每个子 class 创建一个映射,您可以使用 defaultdict
:
class Base():
# add class dictionary mapping uids to instances
uid_to_obj = defaultdict(dict)
def __init__(self, uid):
self.uid = uid
self.__hash = hash(self.uid)
# add specific sub-class mapping for each sub-class
Foo.uid_to_obj[type(self).__name__][uid] = self
def __hash__(self):
return self.__hash
def __eq__(self, other):
return self.__hash == other.__hash
class-specific 词典现在显然在 Foo.uid_to_obj[type(self).__name__]
.