Python使用append写入Tuple Error

时间:2015-02-20 23:25:50

标签: python append tuples python-idle


我正在练习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

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

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)

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

谢谢,多拉。

2 个答案:

答案 0 :(得分:2)

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

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

然后我们知道两件事:

  1. 每行的第一项将是考生的名字
  2. 之后会有一些分数,这些分数都是整数
  3. 所以我们可以像这样迭代文件:

    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)
    

    在列表中,列表保持其顺序可能很重要,但所有元素都是相同的。这是你的用例 - 他们是所有分数,你可能想要关联每个考生随着时间的推移而改善,但最终如果考试分数被转移到不同的位置,它不会&# 39;改变它仍然是考试成绩的事实。

答案 1 :(得分: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:]

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

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

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

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