我正在练习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)
修复是什么?我的代码块是完全错误还是什么?
谢谢,多拉。
答案 0 :(得分:2)
首先让我们修复您的数据结构。您按测试者名称引用每个得分元组。通过键(而不是索引)引用值是使用字典完成的。
user_scores = dict() # or = {}. Same difference.
然后我们知道两件事:
所以我们可以像这样迭代文件:
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:]]
在这种情况下使用列表比使用元组存储分数更好,因为可以附加到列表,可变类型,但不能附加到元组,不可变类型。