【问题标题】:error more than 1 value to unpack错误超过 1 个要解压的值
【发布时间】:2012-12-18 09:14:15
【问题描述】:

我什至不确定这个错误到底是什么问题。任何信息都会非常有帮助。

到目前为止我有什么:

def equations(specie,elements):
vectors=[]
for x in specie: 
    vector=extracting_columns(x,elements)
    vectors.append(vector)

当我跑步时:

 equations(['OH', 'CO2','c3o3','H2O3','CO','C3H1'], 
 ['H', 'C', 'O'])

我收到以下错误:

    Traceback (most recent call last):
File "<stdin>", line 1, in <module>

文件“_sage_input_77.py”,第 10 行,在 exec compile(u'print support.syseval(python, u"equations([\'OH\', \'CO2\',\'c3o3\',\'H2O3\',\' CO\',\'C3H1\'], unel)", SAGE_TMP_DIR) 文件“”,第 1 行,在

文件“/sagenb/sage_install/sage-5.4-sage.math.washington.edu-x86_64-Linux/devel/sagenb-git/sagenb/misc/support.py”,第 479 行,在 syseval 中 返回 system.eval(cmd,sage_globals,locals = sage_globals) 文件“/sagenb/sage_install/sage-5.4-sage.math.washington.edu-x86_64-Linux/local/lib/python2.7/site-packages/sage/misc/python.py”,第 56 行,在 eval 评估(z,全局) 文件“”,第 1 行,在

文件“”,第 4 行,在方程式中

文件“”,第 3 行,在 extracting_columns 中

ValueError: 需要超过 1 个值才能解压

如果需要,我以前的功能: 重新进口 def parse_formula(公式): '''给定一个简单的化学式,返回一个(元素,多重性)元组列表。

Example:
'H2SO4' --> [('H', 2.0), ('S', 1.0), ('O', 4.0)]


'''

return [ (elem, float(mul) if mul else 1.) for (elem, mul) in re.findall(r'([A-Z][a-z]*)(\d*)', formula) ]

def 唯一元素(组): c=[] 对于组中的元素: 片=解析公式(元素) 对于 x 件: c.append(x[0])

return list(set(c))

def extracting_columns(物种,元素): 物种向量=零(len(元素)) 对于 (el,mul) 实物: species_vector[elements.index(el)]=mul

return species_vector

【问题讨论】:

  • 请修正格式,以便我们可以复制并粘贴它并尝试一下——或者至少阅读一下。

标签: python


【解决方案1】:

问题是您调用extracting_columns 时使用'OH' 这样的字符串作为第一个参数,因此当您尝试执行for (el,mul) in specie: 时,它会尝试将'O' 解压缩为(el, mul)

一个简单的调试方法是在有问题的行之前插入一个print

def extracting_columns(specie, elements):
  species_vector=zeros(len(elements))
  print(specie)
  for (el,mul) in specie:
    species_vector[elements.index(el)]=mul
  return species_vector

那么,extracting_columns 是如何获得'OH' 的?好吧,让我们看看它的名字,还有几个prints:

def equations(specie,elements):
  vectors=[]
  print(specie)
  for x in specie:
    print(x)
    vector=extracting_columns(x,elements)
    vectors.append(vector)

现在,当你运行它时,你会看到specie['OH', 'CO2', 'c3o3', 'H2O3', 'CO', 'C3H1'],所以它的第一个元素显然是'OH'

至于如何解决这个问题……好吧,在不知道你实际想要做什么的情况下,很难告诉你如何去做。但显然,如果您想遍历extracting_columns 的第一个参数并将每个项目视为一对,则必须将其传递给一对序列而不是字符串。

但看起来您的parse_formula 是专门为将'OH' 之类的字符串转换为[('O', 1.0), ('H', 1.0)] 之类的对列表而设计的。所以大概问题在于您只是忘记在某个地方调用它。也许您希望equations 看起来像这样?

def equations(specie, elements):
  vectors=[]
  for x in specie:
    formula = parse_formula(x)
    vector=extracting_columns(formula, elements)
    vectors.append(vector)

这会做一些事情,没有任何例外。是不是你真正想要的,我不知道。

无论如何,学习如何查看代码中实际发生的情况并调试琐碎的问题可能比立即在此处获得正确答案更重要。

【讨论】:

  • +1,很好的解释(很高兴看到其他人使用两个空格缩进:))。
  • @RocketDonkey:感谢为python-mode.el 编写了用于两个空格缩进的自动检测代码的人;出于某种原因,这只是对如何处理 OP 代码的最佳猜测。就个人而言,我有时会在诸如 SO 之类的地方发布时使用两个空格,在那里人们甚至可能无法阅读 76 列,但我尝试坚持使用四个空格来发布和维护代码(遵循 PEP 8)。
  • 有道理,这里关于两个间距的好处是为了提高可读性。我发现我总是在这里为 PEP 8/公共批准合规性使用四个空格,但我开始按照 Google 样式指南学习 Python 并且还没有改掉两个空格的习惯(尽管我 [显然] 不专业编码,所以我唯一打扰的人就是我)。无论如何,一如既往的好答案:)
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2013-04-04
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多