通过哈希查找集合中的项目

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__].