从列表中提取值并使用 python 创建嵌套字典
Extract values from a list and create nested dictionary using python
我正在尝试从列表中提取值并将其填充到嵌套字典中。
输入:
['abc-bcd_10_01_physics_90_70_20',
'abc-bcd_10_01_chemistry_85_75_10',
'ac-bd_10_03_biology_60_50_10',
'ad-bcd_10_05_physics_70_50_20',
'ac-bd_10_03_physics_65_50_15']
预期输出:
[
{'first-name' : 'abc',
'last-name' : 'bcd',
'class' : '10',
'roll-number' : 1,
'marks' : [{'subject':'physics',
'total' : 90,
'theory' : 70,
'practical' : 20},
{'subject':'chemistry',
'total' : 85,
'theory' : 75,
'practical' : 10}]
},
{'first-name' : 'ac',
'last-name' : 'bd',
'class' : '10',
'roll-number' : 3,
'marks' : [{'subject':'biology',
'total' : 60,
'theory' : 50,
'practical' : 10},
{'subject':'physics',
'total' : 65,
'theory' : 50,
'practical' : 15},
]
},
{'first-name' : 'ad',
'last-name' : 'bcd',
'class' : '10',
'roll-number' : 5,
'marks' : [{'subject':'physics',
'total' : 70,
'theory' : 50,
'practical' : 20}]
}
]
我可以使用拆分函数从输入列表中提取值并将其填充到普通字典中,但卡在需要按键分组的位置 first-name,last- name,class,roll-number 并在名为 marks.
的公共密钥下收集其他密钥的列表
此外,我需要字典中的键与上面指定的顺序相同。
要按名称、class 和卷号对科目分数进行分组,您需要构建一个以这些值作为键的字典(我通过将它们与 #
连接起来制作了一个字典,我认为不能出现在 class
或 roll number
) 中的字符串,然后将每个主题推入一个标记数组。遍历所有输入后,使用 dict.values
转换为字典列表:
from collections import defaultdict
marks = ['abc-bcd_10_01_physics_90_70_20',
'abc-bcd_10_01_chemistry_85_75_10',
'ac-bd_10_03_biology_60_50_10',
'ad-bcd_10_05_physics_70_50_20',
'ac-bd_10_03_physics_65_50_15']
results = defaultdict(dict)
for m in marks:
name, classn, roll, subject, total, theory, practical = m.split('_')
fn, ln = name.split('-')
key = '#'.join([name, classn, roll])
if key not in results:
results[key] = { 'first_name' : fn,
'last_name' : ln,
'class' : classn,
'roll' : int(roll),
'marks' : []
}
results[key]['marks'].append({ 'subject' : subject,
'total' : int(total),
'theory' : int(theory),
'practical' : int(practical)
})
results = list(results.values())
print(results)
输出:
[
{'first_name': 'abc',
'last_name': 'bcd',
'class': '10',
'roll': 1,
'marks': [{'subject': 'physics', 'total': 90, 'theory': 70, 'practical': 20},
{'subject': 'chemistry', 'total': 85, 'theory': 75, 'practical': 10}
]
},
{'first_name': 'ac',
'last_name': 'bd',
'class': '10',
'roll': 3,
'marks': [{'subject': 'biology', 'total': 60, 'theory': 50, 'practical': 10},
{'subject': 'physics', 'total': 65, 'theory': 50, 'practical': 15}
]
},
{'first_name': 'ad',
'last_name': 'bcd',
'class': '10',
'roll': 5,
'marks': [{'subject': 'physics', 'total': 70, 'theory': 50, 'practical': 20}
]
}
]
简单。
数据:
d = ['abc-bcd_10_01_physics_90_70_20',
'abc-bcd_10_01_chemistry_85_75_10',
'ac-bd_10_03_biology_60_50_10',
'ad-bcd_10_05_physics_70_50_20',
'ac-bd_10_03_physics_65_50_15']
L = []
for m in d:
first_name, last_name = m.split("-")[:2]
last_name = last_name.split("_")[0]
class_, roll_number, subject = m.split("_")[1:4]
total, theory, practical = m.split("_")[4:]
L.append([first_name, last_name, class_, roll_number, subject, total, theory, practical])
L = sorted(L, key=lambda x:x[:2])
d = {}
processed = []
for i in L:
f = dict(zip(['first_name', 'last_name', 'class', 'roll_number', 'subject', 'total', 'theory', 'practical'], i))
if i[:2] in processed:
d['-'.join(i[:2])].append(f)
else:
d['-'.join(i[:2])] = [f]
processed.append(i[:2])
import pprint
pprint.pprint(d)
{'abc-bcd': [{'class': '10',
'first_name': 'abc',
'last_name': 'bcd',
'practical': '20',
'roll_number': '01',
'subject': 'physics',
'theory': '70',
'total': '90'},
{'class': '10',
'first_name': 'abc',
'last_name': 'bcd',
'practical': '10',
'roll_number': '01',
'subject': 'chemistry',
'theory': '75',
'total': '85'}],
'ac-bd': [{'class': '10',
'first_name': 'ac',
'last_name': 'bd',
'practical': '10',
'roll_number': '03',
'subject': 'biology',
'theory': '50',
'total': '60'},
{'class': '10',
'first_name': 'ac',
'last_name': 'bd',
'practical': '15',
'roll_number': '03',
'subject': 'physics',
'theory': '50',
'total': '65'}],
'ad-bcd': [{'class': '10',
'first_name': 'ad',
'last_name': 'bcd',
'practical': '20',
'roll_number': '05',
'subject': 'physics',
'theory': '50',
'total': '70'}]}
我正在尝试从列表中提取值并将其填充到嵌套字典中。
输入:
['abc-bcd_10_01_physics_90_70_20',
'abc-bcd_10_01_chemistry_85_75_10',
'ac-bd_10_03_biology_60_50_10',
'ad-bcd_10_05_physics_70_50_20',
'ac-bd_10_03_physics_65_50_15']
预期输出:
[
{'first-name' : 'abc',
'last-name' : 'bcd',
'class' : '10',
'roll-number' : 1,
'marks' : [{'subject':'physics',
'total' : 90,
'theory' : 70,
'practical' : 20},
{'subject':'chemistry',
'total' : 85,
'theory' : 75,
'practical' : 10}]
},
{'first-name' : 'ac',
'last-name' : 'bd',
'class' : '10',
'roll-number' : 3,
'marks' : [{'subject':'biology',
'total' : 60,
'theory' : 50,
'practical' : 10},
{'subject':'physics',
'total' : 65,
'theory' : 50,
'practical' : 15},
]
},
{'first-name' : 'ad',
'last-name' : 'bcd',
'class' : '10',
'roll-number' : 5,
'marks' : [{'subject':'physics',
'total' : 70,
'theory' : 50,
'practical' : 20}]
}
]
我可以使用拆分函数从输入列表中提取值并将其填充到普通字典中,但卡在需要按键分组的位置 first-name,last- name,class,roll-number 并在名为 marks.
的公共密钥下收集其他密钥的列表此外,我需要字典中的键与上面指定的顺序相同。
要按名称、class 和卷号对科目分数进行分组,您需要构建一个以这些值作为键的字典(我通过将它们与 #
连接起来制作了一个字典,我认为不能出现在 class
或 roll number
) 中的字符串,然后将每个主题推入一个标记数组。遍历所有输入后,使用 dict.values
转换为字典列表:
from collections import defaultdict
marks = ['abc-bcd_10_01_physics_90_70_20',
'abc-bcd_10_01_chemistry_85_75_10',
'ac-bd_10_03_biology_60_50_10',
'ad-bcd_10_05_physics_70_50_20',
'ac-bd_10_03_physics_65_50_15']
results = defaultdict(dict)
for m in marks:
name, classn, roll, subject, total, theory, practical = m.split('_')
fn, ln = name.split('-')
key = '#'.join([name, classn, roll])
if key not in results:
results[key] = { 'first_name' : fn,
'last_name' : ln,
'class' : classn,
'roll' : int(roll),
'marks' : []
}
results[key]['marks'].append({ 'subject' : subject,
'total' : int(total),
'theory' : int(theory),
'practical' : int(practical)
})
results = list(results.values())
print(results)
输出:
[
{'first_name': 'abc',
'last_name': 'bcd',
'class': '10',
'roll': 1,
'marks': [{'subject': 'physics', 'total': 90, 'theory': 70, 'practical': 20},
{'subject': 'chemistry', 'total': 85, 'theory': 75, 'practical': 10}
]
},
{'first_name': 'ac',
'last_name': 'bd',
'class': '10',
'roll': 3,
'marks': [{'subject': 'biology', 'total': 60, 'theory': 50, 'practical': 10},
{'subject': 'physics', 'total': 65, 'theory': 50, 'practical': 15}
]
},
{'first_name': 'ad',
'last_name': 'bcd',
'class': '10',
'roll': 5,
'marks': [{'subject': 'physics', 'total': 70, 'theory': 50, 'practical': 20}
]
}
]
简单。
数据:
d = ['abc-bcd_10_01_physics_90_70_20',
'abc-bcd_10_01_chemistry_85_75_10',
'ac-bd_10_03_biology_60_50_10',
'ad-bcd_10_05_physics_70_50_20',
'ac-bd_10_03_physics_65_50_15']
L = []
for m in d:
first_name, last_name = m.split("-")[:2]
last_name = last_name.split("_")[0]
class_, roll_number, subject = m.split("_")[1:4]
total, theory, practical = m.split("_")[4:]
L.append([first_name, last_name, class_, roll_number, subject, total, theory, practical])
L = sorted(L, key=lambda x:x[:2])
d = {}
processed = []
for i in L:
f = dict(zip(['first_name', 'last_name', 'class', 'roll_number', 'subject', 'total', 'theory', 'practical'], i))
if i[:2] in processed:
d['-'.join(i[:2])].append(f)
else:
d['-'.join(i[:2])] = [f]
processed.append(i[:2])
import pprint
pprint.pprint(d)
{'abc-bcd': [{'class': '10',
'first_name': 'abc',
'last_name': 'bcd',
'practical': '20',
'roll_number': '01',
'subject': 'physics',
'theory': '70',
'total': '90'},
{'class': '10',
'first_name': 'abc',
'last_name': 'bcd',
'practical': '10',
'roll_number': '01',
'subject': 'chemistry',
'theory': '75',
'total': '85'}],
'ac-bd': [{'class': '10',
'first_name': 'ac',
'last_name': 'bd',
'practical': '10',
'roll_number': '03',
'subject': 'biology',
'theory': '50',
'total': '60'},
{'class': '10',
'first_name': 'ac',
'last_name': 'bd',
'practical': '15',
'roll_number': '03',
'subject': 'physics',
'theory': '50',
'total': '65'}],
'ad-bcd': [{'class': '10',
'first_name': 'ad',
'last_name': 'bcd',
'practical': '20',
'roll_number': '05',
'subject': 'physics',
'theory': '50',
'total': '70'}]}