到目前为止,这是我的代码......
class_1={}
if username in class_1:
with open ('class1.txt') as f:
for data in f:
username, score = data.split(",")
class_1[username].append(score)
else:
with open ('class1.txt') as f:
for data in f:
username, score = data.split(",")
class_1[username]=int(score)
print(class_1)
我试图从一个看起来像这样的txt文件中读取:
Alex,5
John,2
Ryan,1
Bill,9
我希望将用户名和分数放入带有列表的字典中,这样如果用户进行多次测试,他的分数会保存在这样的列表中:
class_1 {"Alex":[5,3,2,1,2],"John":[2,2,3,4,7] etc..}
我似乎无法做到这一点,我已经尝试了几个小时!请以任何方式帮助我。
答案 0 :(得分:0)
正如no_name建议的那样 - defaultdict更优雅
from collections import defaultdict
class_1 = defaultdict(list)
with open ('class1.txt') as f:
for data in f:
username, score = data.strip().split(",")
class_1[username].append(score)
答案 1 :(得分:0)
您可以使用collections.defaultdict
执行此类任务:
>>> s="""Alex,5
...
... John,2
...
... Ryan,1
...
... Bill,9
...
... Alex,7
...
... Alex,10
...
... Bill,3
...
... """
>>> from collections import defaultdict
>>> d=defaultdict(list)
>>> for name,score in [i.split(',') for i in s.split('\n') if i]:
... d[name].append(score)
...
>>> d
defaultdict(<type 'list'>, {'Bill': ['9', '3'], 'John': ['2'], 'Alex': ['5', '7', '10'], 'Ryan': ['1']})
在你的情况下:
>>> for name,score in [line.split(',') for line in open('class1.txt') if line]:
... d[name].append(score)
答案 2 :(得分:0)
让我们做一些pythonic解决方案并使用EAFP方法。
比获得许可更容易请求宽恕。这种常见的Python编码风格假设存在有效的键或属性,并且如果假设被证明是错误则捕获异常。这种干净和快速的风格的特点是存在许多try和except语句。该技术与许多其他语言(如C。
)共有的LBYL风格形成对比
那我们在做什么?我们简单地假设这个词典中有一个键,并且有一个列表,我们可以追加得分。如果没有密钥,我们只需创建第一个分数即可创建此列表。
代码将是:
scores={}
with open ('class1.txt') as f:
for line in f:
username, score = line.split(",")
try:
scores[username].append(score)
except KeyError:
scores[username] = [score]