Я обрабатываю текст и мне нужно хранить большие последовательности хэшируемых объектов - иногда строки, иногда кортежи слов и т. д. Я думал об использовании хеш-функции для предоставления простого класса хранения и извлечения, но с моим первым подходом это возможно, что один хэш-ключ может разрешаться более чем в один элемент. Учитывая, что я добавляю функцию get, которая принимает возвращаемое значение add в качестве аргумента, я не могу знать, какой элемент списка нужно вернуть.
class HashStore:
def __init__(self):
self.uniques = {}
def add(self, big_hashable):
hash_value = hash(big_hashable)
if hash_value not in self.uniques:
self.uniques[hash_value] = [big_hashable]
elif big_hashable not in self.uniques[hash_value]:
self.uniques[hash_value].append(big_hashable)
return hash_value
Другой подход в конечном итоге гарантирует, что для каждого уникального хешируемого элемента существует только одно сопоставление.
class SingleStore:
def __init__(self):
self.uniques = {}
self.indexed = {}
self.index = 0
def add(self, big_hashable):
if big_hashable not in self.uniques:
self.index += 1
self.uniques[big_hashable] = self.index
self.indexed[self.index] = big_hashable
return self.uniques[big_hashable]
Это работает и гарантирует, что возвращаемое значение add может быть использовано для возврата уникального значения. Это только кажется немного неуклюжим. Есть ли лучший, более Pythonic способ справиться с этой ситуацией?
Я был неоднозначен в вопросе. Есть две проблемы: одна из них заключается в том, что у меня есть миллионы объектов, которые в настоящее время используют ключи размером от 100 до 1000 байт каждый (вещь big_hashable). Преобразование их в целые числа позволит обрабатывать больше данных, чем я могу сейчас. Во-вторых, сохранение только одной канонической копии каждой вещи big_hashable также сократит использование памяти, хотя это первая проблема, которая вызывает мой вопрос, потому что каждый ключ на самом деле является отдельной копией вещи big_hashable.
dict
иset
. Но сделать это, очевидно, будет точно так же, как просто использоватьdict
илиset
, за исключением того, что это намного медленнее и сложнее, что является довольно хорошим аргументом в пользу использованияdict
илиset
в зависимости от ситуации… - person abarnert   schedule 24.08.2013