Передача списка ключей в словарь для модификации - PullRequest
0 голосов
/ 01 июля 2019

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

zero_terms = np.array(unigrams)[tfmatrix[i]==0]
nonzero_terms = np.array(unigrams)[tfmatrix[i]>0]

idf_values[zero_terms]=1
idf_values[nonzero_terms]+=1

В основном, изменения должны быть внесены в словарь. idf_values: zero_terms - это пустой массив этих ключей, значение которого равно нулю в tfmatrix, а nonzero_terms представляет собой простой массив этих ключей, значение которого равно ненулевой в tfmatrix. При запуске этого кода я получаю следующую ошибку:

TypeError: unhashable type: 'numpy.ndarray'

Словарь видит весь массив как ключ, тогда как я хочу, чтобы элементы массива рассматривались как ключи. Как мне это сделать?

Редактировать: попросили предоставить дополнительную информацию. unigrams - это словарь с ключами, которые совпадают с ключами idf_values и столбцами в tfmatrix, который является двумерной матрицей. Моей целью было обойти это за цикл:

for i in range(0,tfmatrix.shape[0]):
    for j in range(0,tfmatrix.shape[1]):
          if tfmatrix[i][j]==0:
                 #change value to 1 in idf_values
          else:
                #incremenet value in idf_values

1 Ответ

0 голосов
/ 01 июля 2019

Простой способ - использовать цикл for:

for term in zero_terms:
    idf_values[term] = 1
for term in nonzero_terms:
    idf_values[term] += 1

Имейте в виду, что += вызовет ошибку, если term еще не в idf_values. Я оставлю решение этой проблемы в качестве упражнения для читателя.

В зависимости от того, как выглядят ваши входные данные, вы могли бы также использовать dict.update(), чтобы обойти это ограничение, но это все равно будет связано с использованием циклов for, и оно все равно будет примерно таким же уровень сложности вычислений:

zero_dict = zip(zero_terms, [1]*zero_terms)
nonzero_dict = {term, idf_values[term]+1 for term in nonzero_terms}
idf_values.update(zero_dict, nonzero_dict)

С технической точки зрения вы могли бы использовать диктовку, чтобы сделать все это в одной строке, но это немного грязно и нечитабельно и имеет ту же сложность:

idf_values = {k:(1 if kin zero_terms else v+1 if k in nonzero_terms else v) for k, v in idf_values}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...