Python 将密钥列表传递到字典以进行修改
我想知道是否有可能将键列表输入(已经制作好的)字典并修改相应的值。以下是解决我的问题的代码:Python 将密钥列表传递到字典以进行修改,python,arrays,python-3.x,numpy,python-3.7,Python,Arrays,Python 3.x,Numpy,Python 3.7,我想知道是否有可能将键列表输入(已经制作好的)字典并修改相应的值。以下是解决我的问题的代码: 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 基本上,要在字典中进行更改:zero\u terms是在tfmatrix中值为零的键的num
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
基本上,要在字典中进行更改:zero\u terms
是在tfmatrix
中值为零的键的numpy数组,nonzero\u terms
是在tfmatrix
中值为非零的键的numpy数组。运行此代码时,我遇到以下错误:
TypeError: unhashable type: 'numpy.ndarray'
字典将整个数组视为键,而我希望它将数组的元素视为键。我该怎么办
编辑:要求提供更多详细信息。
unigrams
是一个字典,其键与idf_值的键和tfmatrix
中的列相同,后者是一个二维numpy矩阵。我的目标是绕过这个循环:
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
一个简单的方法就是使用for
循环:
for term in zero_terms:
idf_values[term] = 1
for term in nonzero_terms:
idf_values[term] += 1
请记住,如果术语
不在idf_值中,则+=
将导致错误。我将把解决那个问题作为练习留给读者
根据输入数据的外观,您可能也可以使用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}
从技术上讲,你可以使用听写理解在一行中完成所有内容,但它有点凌乱和不可读,并且具有相同的复杂性:
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}
我可以,但实际上我的目的是避免使用for循环。这是一个绝对庞大的矩阵和字典,因此,我不确定是否完全有可能避免使用<代码> < < /Cord>循环> -你可以考虑查看你的项目的更大的结构,选择更合适的数据结构来更有效地处理你的数据。根本没有办法?数据结构无法更改,这实际上是最适合我的用例的数据结构。但是这个嵌套的for循环在任何合理的时间内都不会执行。据我所知,它们实际上不需要嵌套,这应该是一个更好的解决方案。但无论如何,你的最小运行时间将取决于zero_terms
和nonzero_terms
有多大-要处理每一个元素,你必须访问其中的每一个元素。我实际上是问你它们在内容方面是什么样子,而不是它们是如何定义的,在字典一次只接受一个键之前,这并没有增加多少内容。使用numpy
不会改变这一点。dict
上唯一的批量操作是从另一个dict
更新。