如何从文件中读取字典作为列表

时间:2015-02-23 19:54:09

标签: python dictionary

到目前为止,这是我的代码......

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..}

我似乎无法做到这一点,我已经尝试了几个小时!请以任何方式帮助我。

3 个答案:

答案 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]