defaultdict (lambda: set ()) как добавить - PullRequest
0 голосов
/ 29 октября 2018

Пример кода MVR:

w_1, w_2 = None, None
tokens = ['hello', 'world', 'type', 'contexts', 'hello', 'again', 'world']
self.type_contexts = defaultdict(lambda: set())
for word in tokens:
    self.type_contexts[word] += {(w_2,w_1)}
# Update context
w_2 = w_1
w_1 = word

Я хочу, чтобы default_contexts type_contexts отображал слово -> {(w_2, w_1)}, но я не уверен, как заполнить их как наборы.Я продолжаю сталкиваться с ошибками TypeError, такими как TypeError: неподдерживаемые типы операндов для + =: 'set' и 'set'

или с помощью функции set add () в моей строке type_contexts:

self.type_contexts[word].add({(w_2,w_1)})

приводит к ошибке TypeError: unhashable тип: 'set'

Я понимаю, почему я получаю эти ошибки, но не знаю, как их исправить, сохраняя lambda: set () defaultdict

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Наборы объединяются с оператором |, а не +, и поэтому вы хотите |= вместо +=.В качестве альтернативы, поскольку вы добавляете набор только из одного элемента, вместо этого вы можете просто add этот элемент:

self.type_contexts[word].add((w_2,w_1))
0 голосов
/ 29 октября 2018

Ошибка в том, что add ожидает, что элемент (хешируемый) не является набором, если вы хотите добавить новый набор в существующее одноразовое обновление:

a = set()
a.add(1)
a.update({2})
print(a)

Выходные данные

{1, 2}

Первая строка показывает, как использовать add, в вашем случае это будет:

self.type_contexts[word].add((w_2, w_1)) 

Вторая показывает, как добавитьустановить существующий, чтобы вы могли изменить свой вызов на:

self.type_contexts[word].update({w_2, w_1}).

Хотя я бы не рекомендовал использовать обновление с набором из одного элемента.

...