Python中的“too many values to unpack”错误

3
import pylab as pl

data = """AP 10
AA 20
AB 30
BB 40
BC 40
CC 30
CD 20
DD 10"""

grades = []
number = []

for line in data.split("/n"):
     x, y = line.split()
     grades.append(x)
     number.append(int(y))       
fig = pl.figure()
ax=fig.add_subplot(1,1,1)
ax.bar(grades,number)
p.show()

这是我的代码,我希望从数据中制作一个条形图。起初当我运行代码时,我在第17行遇到了缩进错误。在给所有for块添加空格后,我开始在第16行遇到“too many values to unpack”错误信息。由于我是Python的新手,不知道该如何继续操作。

4个回答

4

您有一行没有两个项目:

 x, y = line.split()

没有将其拆分为两个元素,这导致出现错误。很可能是因为您没有正确拆分data变量,并且整个文本作为一个长文本。/n在您的data数据中不存在。

改用.splitlines()

for line in data.splitlines():
     x, y = line.split()

4
问题在于你的for循环使用错误的分隔符(/n)进行了分割,而不是\n
但是,当你只想要按照换行符进行分割时,实际上字符串有一个splitlines()方法可以做到这一点:你应该使用这个方法,因为它将处理*nix和Windows之间的不同换行符(*nix系统通常用\r\n表示换行符,而Windows使用\n,旧版的Mac OS使用\r:请查看Python文档以获取更多信息)。
你的错误发生在下一行:由于字符串没有按行分割,整个字符串现在将被空格分割,这将产生比你尝试分配给元组的2个值更多的值。

非常感谢。嗯,现在我遇到了一个错误:“无法隐式地将'float'对象转换为str”。 但是有浮点对象吗?为什么会出现这样的错误? - user2471181
我不是100%确定,但我猜测错误来自于matplotlibbar函数(http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar)需要两个参数:- left:左侧的x坐标(我猜这些需要是浮点数而不是字符串)。 - right:条形图的高度。因此,您可能需要使用表示条形图宽度的列表作为第一个参数,而不是标签。要设置标签,您可能可以在matplotlib中使用xticks函数- matplotlib-docs中有一个详细的示例。看看是否有帮助,或者再次提问 :) - BergmannF
是的,我正确阅读了错误信息,它是由于 matplotlib 函数引起的。 因此,我将 grades 更改为 [1,2,3,4,5,6,7,8],然后使用 xticks 函数,现在问题已经解决了 :) 再次感谢你。 - user2471181

3
for line in data.split("/n")

应该是

for line in data.split("\n")

甚至更好的是:
for line in data.splitlines()

这是那种时候,第二双眼睛是无价之宝! - Awalias

1

作为一种有趣的替代方法,与其他人提出的使用splitlines方法不同,您也可以在此处使用StringIO对象:

>>> data = """AP 10
... AA 20
... AB 30
... BB 40
... BC 40
... CC 30
... CD 20
... DD 10"""
>>> import cStringIO as StringIO
>>> filelike = StringIO.StringIO(data)
>>> for line in filelike:
...     print line.split()
... 
['AP', '10']
['AA', '20']
['AB', '30']
['BB', '40']
['BC', '40']
['CC', '30']
['CD', '20']
['DD', '10']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接