【问题标题】:how to solve ValueError in Python如何在 Python 中解决 ValueError
【发布时间】:2014-04-14 18:36:04
【问题描述】:

我正在开发一个图像搜索引擎应用程序,我将代码放在单独的 .py 文件中,并且运行良好。但我想优化它。当我使用下面的函数时,它给了我一个 ValueError。

我的代码是这样的(只有我采取的相关行):

def example():
  i = 0
  resultlist_key = []
  result_list = list()
  a_list = list()
  b_list = list()
  a_list.append(feature_matrix_ip)# feature_matrix_ip contains features of the query image
  while i < 70:
      b_list.append(feature_matrix_db[i])# feature_matrix_db contains features of img. in DB
      dist = distance.euclidean(a_list,b_list[i])
      result_list.append(dist)
      resultlist_key = OrderedDict(sorted(enumerate(result_list),key=lambda x: x[0])).keys()
      i = i + 1 
      res_lst_srt = {'values': result_list,'keys':resultlist_key}
      res_lst_srt['values'], res_lst_srt['keys'] = zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys'])))# sorting according to the least distance and the key will not change
      key = res_lst_srt['keys']

当我分析时,我没有得到任何解决方案。我的错误陈述是:

%run "D:/6th sem/Major project/Code/frame.py"
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\HP\AppData\Local\Enthought\Canopy32\App\appdata\canopy-1.0.3.1262.win-x86\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "D:\6th sem\Major project\Code\frame.py", line 323, in matching_image
res_lst_srt['values'], res_lst_srt['keys'] = zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys'])))

ValueError: need more than 0 values to unpack

我不知道这个错误是否来自命名问题。当代码在函数外部时它会正常工作,但我希望代码在函数内部,以便优化程序。

有什么解决这个错误的建议吗?

【问题讨论】:

  • 如果您在出现错误的行之前执行print zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys']))),输出是什么?
  • @Kevin 当我尝试打印 ti 时,我得到了这个结果{'keys': [], 'values': []},但是当我尝试在函数之外打印 sane 时,我得到了正确的键和值。跨度>
  • 你确定这是print zip(...的结果吗?因为那是一个字典,而 zip 只返回一个列表。
  • 我和@Kevin 在一起...您的print 语句显示了一个字典,而zip 永远不会返回...您不是在某个地方缺少[ 吗?无论如何,让我们尝试缩小问题范围:在给出错误的行上添加一行 print "i: %s, rest_lst_srt: %s" % (i, rest_lst_srt) 并将输出添加到您的问题中(这将显示哪些迭代失败以及原因)。另外,在我看来,您正在尝试执行stackoverflow.com/a/2733056/289011 中描述的操作,如果是这种情况,您的代码可能会减少。您确定需要OrderedDict 来对result_list 进行排序吗?
  • @user3483746, 对...这只是让代码很难遵循对我来说 :-D无论如何...如何关于评论的另一部分? (print "i %s... 东西?)

标签: python python-2.7


【解决方案1】:

所以,我的猜测是这部分:

zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys'])))

正在向任何zips 返回一个空列表:

>>> foo, bar = []
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 0 values to unpack

现在,如果您想填充 res_lst_srt(我似乎从您的问题中理解),为什么不让它变得更简单?

>>> values=[1,2,3]
>>> keys=['a', 'b', 'c']
>>> my_dict = dict(zip(keys, values))
>>> my_dict
{'a': 1, 'c': 3, 'b': 2}

values 将是 res_lst_srt['values']keys 将是 res_lst_srt['keys']my_dict 将是 res_lst_srt。不?不应该吗?

【讨论】:

  • 实际上这行代码zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys']))) 将按升序对值进行排序,而不考虑其键。如果我按照您的建议进行操作,那么我可能无法获得所需的图像。
【解决方案2】:

通过查看这个简单的案例可以找到您的问题。

>>> a, b = tuple() # or you could write a, b = []

Traceback (most recent call last):
  File "<pyshell#319>", line 1, in <module>
    a, b = tuple()
ValueError: need more than 0 values to unpack
>>> 

等于运算符一侧的值的长度必须与另一侧匹配。

很明显,返回的值是..

zip(*sorted(zip(res_lst_srt['values'], res_lst_srt['keys'])))

..最终返回一个空列表/元组。哪个让你伤心。

【讨论】:

  • 是的,但我很困惑,因为当代码在函数外部时,我会得到值,但是当函数内部的代码相同时,它会给我一个空列表。
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2020-05-06
  • 2020-01-22
  • 2020-12-16
  • 1970-01-01
相关资源
最近更新 更多