Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将密钥列表传递到字典以进行修改_Python_Arrays_Python 3.x_Numpy_Python 3.7 - Fatal编程技术网

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
更新