【问题标题】:Creating sub dictionaries from unorganised csv and existing dictionary keys in python从无组织的 csv 和 python 中的现有字典键创建子字典
【发布时间】:2020-01-11 23:57:48
【问题描述】:

我有一个 csv 文件,指示(按顺序)姓名、年级、跳过的课程名称、次数,我已将其解析为列表列表。

csvlist = [['name','grade','lesson','number'],
           ['Jade','8','English','1'],
           ['James','7','Maths','3']...]

我已经有一本字典,其中包含所有 8 年级学生的姓名作为键,跳过的课程总数和 gpa 作为子字典,

names_dic = {'Jade':{'skip':2,'gpa':8.34}, 
             'Mark':{'skip':16,'gpa':5.67'},
              ...}

现在我想创建一个字典,它使用与names_dic 相同的键,并将它们链接到它们各自的跳过课程名称和次数。问题是,在 csv 中,一个人跳过同一节课不止一次,它被写成多行(数字不一定表示该特定课程跳过的总小时数)。

我尝试的是:

lesson = {}
keys = names_dic.keys()
subkeys = []
subvalues = []
number = 0
subkeys.append(crimes_list[1][2])
for i in crimes_list[1:]:
    for key in mykeys:
        sub_dic = {}
        if i[0] in keys:
            if i[2] not in subkeys:
                subkeys.append(i[2])
                number += int(i[3])
                subvalues.append(valcount)
            else:
                number += int(i[3])
        else:
            pass
        lesson[key] = sub_dic
lesson = dict(zip(keys, subvalues))

预期的输出是:

lesson = {'Jade':{'English':1,'Physics':1}, 
          'Mark':{'French':3,'Biology':5,'English':2,'Geography':3,'PE':3}
          ..}

我不知道该怎么做。我已经做了好几天了,但不明白如何遍历 csv 并将正确的总和链接到正确的课程和名称。我确信有一些包可以很容易地做到这一点,但我是 python 新手,所以我很挣扎。

【问题讨论】:

  • 您能否分享部分 .csv 文件并显示预期结果?
  • 我无法显示csv,但它已被解析并按顺序显示信息。我现在正在编辑问题
  • @Raphael 我已经编辑过了
  • 你能不能在你的 .csv 文件中加入以下语句:“问题是,在 csv 文件中,一个人跳过同一节课不止一次,它被写成多行(数字不'不一定表示该特定课程跳过的总小时数)。 ?
  • @Raphael 基本上在 csv 中,例如,如果马克跳过法语 3 次,我会得到一行说:马克 8 法语 1,另一行说:马克 8 法语 2。所以我需要做的是表明如果同一主题对同一个人重复多次,我需要将数字相加

标签: python list csv dictionary


【解决方案1】:

使用 json 和 defaultdict

import json
import collections
nested_dict = lambda: collections.defaultdict(nested_dict)

csvlist = [['name','grade','lesson','number'],
           ['Jade','8','English',1],
           ['Jade','8','English',3],
           ['Jade','8','French',4],
           ['James','7','Maths',3]]

names_dic = {'Jade':{'skip':2,'gpa':8.34}, 
             'Mark':{'skip':16,'gpa':5.67}}

lesson = nested_dict()
min_grade = 8

for student in csvlist[1:]:
    student_name = student[0]
    student_grade = student[1]
    student_lesson = student[2]
    student_number = student[3]
  
    # if the key exists add the number
    if float(student_grade) >= min_grade:
        if lesson[student_name][student_lesson]:
            lesson[student_name][student_lesson] += student_number
        else:
            lesson[student_name][student_lesson] = student_number

print(json.dumps(lesson, indent=2, sort_keys=True))

# lesson is a nested dict():
# lesson['Jade']['English'] or
# lesson.get('Jade').get('English')

产量:

{
  "Jade": {    
    "English": 4,    
    "French": 4
  }
}

不使用json和defaultdict

csvlist = [['name','grade','lesson','number'],
           ['Jade','8','English',1],
           ['Jade','8','English',3],
           ['Jade','8','French',4],
           ['James','7','Maths',3]]

names_dic = {'Jade':{'skip':2,'gpa':8.34}, 
             'Mark':{'skip':16,'gpa':5.67}}


lesson = dict()
min_grade = 8

for student in csvlist[1:]:
    student_name = student[0]
    student_grade = student[1]
    student_lesson = student[2]
    student_number = student[3]

    # if the key exists add the number
    if float(student_grade) >= min_grade:
        if not lesson.get(student_name, False):
            lesson[student_name] = {}
        try:
            lesson[student_name][student_lesson] += student_number
        except:
            lesson[student_name][student_lesson] = student_number


# printing
for student_k, student_v in lesson.items():
    print(student_k)
    for student_lesson in student_v.items():
         print(student_lesson)
    print()

产量:

'Jade'
('English', 4)
('French', 4)

【讨论】:

  • 这很好用,但有没有办法只包括 8 年级的学生?
  • 我把条件 == 8,如果你愿意,你可以改成 >=8 或 >8
  • 我不知道为什么,但是我试过了,我仍然得到所有的学生
  • 我添加了条件 == 8 (if float(student_grade) == min_grade:),所以只会添加 8 年级的学生。成绩是从 csvlist 中获取的吧?
  • json的问题是我必须处理嵌套字典中的数据,但是json的类型是字符串。谢谢你的第二个回答
猜你喜欢
  • 2016-11-20
  • 2014-10-02
  • 2014-11-11
  • 1970-01-01
  • 2021-03-25
  • 2021-06-25
  • 1970-01-01
  • 2017-05-05
  • 2017-05-07
相关资源
最近更新 更多