繁体   English   中英

向字典Python添加值

[英]adding values to dictionary Python

我正在尝试将catalogue.txt文件读入字典。 每行包含课程名称,学分数和1h类的集合,例如:CS1P,20,Monday,14,Monday,15,Wednesday,12,Friday,12

我正在使用的功能:

def loadCourseCatalogue ():
    data = open ("catalogue.txt", "r+")
    print data.read ()
    all = {}
    line = data.readline ()
    while line != "":
        line = line.strip ().split (",")
        for j in line:
            all["course"] = line[0]
    return all
    print all



loadCourseCatalogue ()

输出应如下所示:

all = {"course": CS1P}

运行此行后:

for j in line:
        all["course"] = line[0]

像这样:

all = {"course": CS1P, "credits": 20, "timeday": [["Monday", 14], ["Monday", 15], ["Wednesday", 12], ["Friday", 12]]}

在整个第一行完成之后。

到目前为止,我已经尝试了各种可能的组合来添加在网络上找到的值,但没有任何效果。

您的第一个print data.read ()消耗文件中的所有数据,并且什么都没有了,请尝试:

def loadCourseCatalogue ():
    infile = open ("catalogue.txt", "r+")
    data = infile.read ()

然后处理数据。

该行:

print data.read ()

消耗来自文件的所有输入,并将文件指针放在文件末尾。 随后的读取将返回一个空字符串,表示文件的末尾。

我建议您使用for循环遍历文件中的各行。 另外,由于行之间用逗号分隔,因此您可以使用csv模块来帮助将行拆分为单独的字段:

import csv

def loadCourseCatalogue ():
    all = {}
    with open("catalogue.txt") as data:
        for row in csv.reader(data):
            all['course'] = row[0]
            # extract other fields into all
    return all

但是,这将在处理每一行时all覆盖字典中的值。 相反,您可以将课程代码用作字典中的键,并将每个列表中的其余数据添加到其值(也是字典)中。 因此,针对此数据结构:

catalogue = {
    'CS1P': {'credits': 20,
             'timeday': [('Monday', 14),
                         ('Monday', 15),
                         ('Wednesday', 12),
                         ('Friday', 12)]},
    'CS2A': {'credits': 40,
             'timeday': [('Monday', 10), ('Monday', 11), ('Thursday', 12)]},
   #etc,
}

使用此数据结构,您可以轻松查找给定课程的数据:

>>> catalogue['CS1P']
{'credits': 20, 'timeday': [('Monday', 14), ('Monday', 15), ('Wednesday', 12), ('Friday', 12)]}

以下是将创建此类字典的一些代码:

import csv
from pprint import pprint

def loadCourseCatalogue(data):
    catalogue = {}
    for row in csv.reader(data):
        course = row[0]
        catalogue[course] = {
            'credits': int(row[1]),
            'timeday': zip(row[2::2], (int(i) for i in row[3::2]))
        }
    return catalogue

with open('catalogue.txt') as f:
    catalogue = loadCourseCatalogue(f)
    pprint(catalogue)

输入:

CS1P,20,Monday,14,Monday,15,Wednesday,12,Friday,12
CS2A,40,Monday,10,Monday,11,Thursday,12

输出为:

{'CS1P': {'credits': 20,
          'timeday': [('Monday', 14),
                      ('Monday', 15),
                      ('Wednesday', 12),
                      ('Friday', 12)]},
 'CS2A': {'credits': 40,
          'timeday': [('Monday', 10), ('Monday', 11), ('Thursday', 12)]}}

如果您想知道课程的学分:

>>> catalogue['CS2A']['credits']
40

您将覆盖列表,而不是将新值附加到列表中。 此外,您还应该为第一次迭代提供默认的空列表。 更换:

all["course"] = line[0]

与:

all["course"] = all.get("course", []).append(line[0])

还要避免使用print data.read()因为它将读取所有文件,而不会为后续的readline留下任何东西。 如果要让它在那里,请在打印后使用data.seek(0)

按照所写,这将替换每一行的字典关键字course ,并且最终在字典的最后只有一行。

您可以通过建立all列表(每个值都是代表一行的字典)来解决此问题,或者如果您的课程名称都是唯一的,则可以使用课程名称本身作为dict键,并使其值成为属性的字典对于那门课程。

def loadCourseCatalogue ():
    all_cources={}
    data = open("catalogue.txt","r").readlines()
    for line in data:
        _all={}
        _all['credits']=line.split(',')[1]
        _all['timeday']=line.split(',')[2:]
        all_cources[line.split(',')[0]]=_all
    return all_cources

我认为您想做这样的事情:

import csv
from pprint import pprint

def pairwise(iterable):
    "s -> [[s0,s1], [s2,s3], [s4, s5], ...]"
    a = iter(iterable)
    return [list(pair) for pair in zip(a, a)]

def loadCourseCatalogue():
    all = {}
    with open ("catalogue.txt", "r+") as data:
        for row in csv.reader(data):
            all[row[0]] = {'credits': row[1], 'timeday' : pairwise(row[2:])}

    pprint(all)
    return all

catalogue = loadCourseCatalogue()

为了进行测试,我将数据文件示例扩展为:

CS1P,20,Monday,14,Monday,15,Wednesday,12,Friday,12
CS2P,19,Monday,13,Monday,14,Wednesday,11,Friday,11
CS3P,18,Monday,12,Monday,13,Wednesday,10,Friday,10

产生了以下输出:

{'CS1P': {'credits': '20',
          'timeday': [['Monday', '14'],
                      ['Monday', '15'],
                      ['Wednesday', '12'],
                      ['Friday', '12']]},
 'CS2P': {'credits': '19',
          'timeday': [['Monday', '13'],
                      ['Monday', '14'],
                      ['Wednesday', '11'],
                      ['Friday', '11']]},
 'CS3P': {'credits': '18',
          'timeday': [['Monday', '12'],
                      ['Monday', '13'],
                      ['Wednesday', '10'],
                      ['Friday', '10']]}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM