Python 使用追加写入元组错误

Python Write to Tuple Error with append


我正在练习 Python 3.3.2,我想练习对元组的追加技术。
我有一个名为 user_scores.txt. 的文本文件,它包含我工作场所的人提交的数学问题分数。他们提交了他们可以提供的不同答案。文件如下(Alex只提交了两个):

Alex, 35, 39
Daniel, 34, 35, 36 
Richard, 21, 23, 24

我正在尝试将这些分数写入以下形式的元组:

Name:Score, Score, Score.

例如:
Alex:35, 39,
Daniel:34, 35, 36

我尝试使用下面的代码,但它不起作用,因为它 returns 下面的错误:

user_scores = []

with open('user_scores.txt') as f:
    for line in f:
        worker,score = line.strip().replace("\n","").split(",")
        user_scores[worker].append(int(score))

错误:

ValueError: too many values to unpack (expected 2)

修复方法是什么?我的代码块是完全错误还是什么?

谢谢,朵拉。

首先让我们修复您的数据结构。您指的是每个分数元组的应试者姓名。通过键(而不是通过索引)引用值是使用字典完成的。

user_scores = dict() # or = {}. Same difference.

然后我们知道两件事:

  1. 每行第一项为考生姓名
  2. 之后会有一些分数,都是整数

所以我们可以像这样遍历文件:

with open('path/to/file.txt') as infile:
    for line in infile:
        name, *scores = line.strip().split(',')

那里的 glob * 指示 Python 会有很多这样的东西,所以制作一个同等大小的元组。 a, *b = (1, 2, 3, 4, 5) 使得 a = 1; b = (2, 3, 4, 5)。现在分配您的值很容易!

user_scores[name] = [int(score) for score in scores]

请注意,这会创建一个列表,而不是一个元组,但这很可能是您想要的。元组表明每个元素的位置不仅重要而且有意义。这很容易解释为二维坐标平面中的一个点表示为有序对

#x, y
(1, 10)

有很大不同
#x , y
(10, 1)

在列表中,保持列表的顺序可能很重要,但所有元素的含义都是一样的。这就是你的用例——它们都是分数,你可能想关联每个应试者随着时间的推移而提高,但最终如果测试分数移动到不同的位置,它不会改变它的事实还是考试成绩。

您似乎在尝试写入列表,而不是元组。元组是不可变的,所以无论如何这是不可能的。看起来您也在尝试通过字符串索引列表。这是不可能的,因为列表需要按数字索引。我想你想要的是字典。

另外,当你这样做时

worker, score = [list of things]

python 期望事物列表中有 2 个项目。显然,您将拥有数量可变的东西。

试试这个:

user_scores = {}

with open('user_scores.txt') as f:
    for line in f:
        this_line = line.strip().replace("\n","").split(",")
        user_scores[this_line[0]] = this_line[1:]

这将创建一个字典,你可以通过一个人的名字访问它,并得到他们的分数列表,无论列表中有多少东西。对于每一行,它将用逗号分隔行中的所有内容,将人的名字设为键,并将值设为他们分数的列表。

如果您希望将分数存储为数字而不是字符串,请将最后一行替换为:

user_scores[this_line[0]] = [int(score) for score in this_line[1:]]

在这种情况下使用列表比使用元组存储分数要好,因为可以附加到列表(一种可变类型),但不能附加到元组(一种不可变类型)。