【问题标题】:Passing list of keys to dictionary for modification将键列表传递给字典进行修改
【发布时间】:2019-07-01 13:07:59
【问题描述】:

我想知道是否可以将键列表输入(已经制作的)字典并修改相应的值。这是我的问题的代码:

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 中值为 0 的键的 numpy 数组,nonzero_terms 是值为的键的 numpy 数组tfmatrix 中的非零值。在运行此代码时,我收到以下错误:

TypeError: unhashable type: 'numpy.ndarray'

字典将整个数组视为键,而我希望它将数组的元素视为键。我该怎么办?

编辑:被要求提供更多详细信息。 unigrams 是一个字典,其键与idf_values 的键和tfmatrix 中的列相同,tfmatrix 是一个二维 numpy 矩阵。我的目标是绕过这个 for 循环:

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

【问题讨论】:

  • 我实际上问的是它们在内容方面的样子,而不是它们的定义方式,这与之前的内容并没有太大的区别
  • 字典一次只接受一个键。 numpy 的使用不会改变这一点。 dict 上的唯一批量操作是 update - 来自另一个 dict

标签: python arrays python-3.x numpy python-3.7


【解决方案1】:

一个简单的方法就是使用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)

从技术上讲,您可以使用 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 循环。这是一个绝对巨大的矩阵和字典,所以希望有一个解决方法。
  • @AnjaliBhavan 我不确定是否完全可以避免在此处使用 for 循环 - 您可能会考虑查看项目的更大结构并选择更合适的数据结构来处理您的数据更高效。
  • 根本没有办法?数据结构无法更改,这实际上是最适合我的用例的一种。但是这个嵌套的 for 循环不会在任何合理的时间内执行。
  • 据我所知,它们实际上不需要嵌套,这应该是a更好的解决方案。但无论如何,您的最小运行时间将取决于 zero_termsnonzero_terms 的大小 - 要对每个元素执行操作,您必须访问它们的每个元素。跨度>
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多