![](/img/trans.png)
[英]Filtering dictionaries and creating sub-dictionaries based on keys/values in 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 的新手,所以我很掙扎。
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
}
}
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.