在没有迭代的情况下获取集合的元素

时间:2015-08-11 13:16:06

标签: python python-2.7 hash set

假设您想要一个可能在集合中的元素。你没有元素本身,但你知道如何计算它的哈希值。你是如何得到这个元素的?

到目前为止,这是我的代码:

import random

class A(object):

    def __init__(self, x):
        self.x = x
        self.rand = random.random()


    def __hash__(self):
        return hash('A{}'.format(self.x))


    def __eq__(self, other):
        return self.__hash__()==other.__hash__()


# create many A instances
N = 10**7
s = set()
for x in xrange(N):
    s.add(A(x))


# test some ways to find a particular A
def find_A_given_x(x):
    """ Iterate over s to find A """
    for a in s:
        if a.x == x:
            return a


def find_A_given_x_without_iterating_s(x):
    """ Try to use hash to get the element??? """
    raise NotImplemented('I don\'t know how to do this!')

1 个答案:

答案 0 :(得分:1)

您无法通过散列从集合中检索对象。请注意,哈希不需要是唯一的!在任何情况下,集合都不是为了检索特定的单个元素(除了从集合中返回任意元素)。

你唯一的选择是遍历集合的所有元素并测试哈希是否匹配,并接受可能有多个这样的匹配。

无论如何,散列用于将对象缩减为散列表中的插槽;如果该槽被另一个对象占用(Dictionary为false),则处理哈希以产生新的槽等。基础哈希表是一个实现细节,不会暴露给内省或其他应用程序。