簡體   English   中英

從無組織的csv和python中的現有字典鍵創建子字典

[英]Creating sub dictionaries from unorganised csv and existing dictionary keys in python

我有一個 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相同的鍵的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 的新手,所以我很掙扎。

使用 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM