如何将3个列表合并到一个字典(具有唯一元素) 用Python编写的代码
如何将3个列表合并到一个字典(具有唯一元素) 用Python编写的代码,python,Python,#以下是3个列表 sections=['A','B','A','A','B'] 学生=['Jack'、'Jim'、'Jack'、'Leena'、'Jim'] subjects=[“数学”、“生物”、“化学”、“英语”、“物理”] #输出应为字典 classDict={'A':{'Jack':{1:'math',2:'Chemistry'},'Leena':{1:'English'},'B':{'Jim':{1:'Biology',2:'Physics'} 我可以将这两个列表中的任何一个合并到一个
#以下是3个列表
sections=['A','B','A','A','B']
学生=['Jack'、'Jim'、'Jack'、'Leena'、'Jim']
subjects=[“数学”、“生物”、“化学”、“英语”、“物理”]
#输出应为字典
classDict={'A':{'Jack':{1:'math',2:'Chemistry'},'Leena':{1:'English'},'B':{'Jim':{1:'Biology',2:'Physics'}
我可以将这两个列表中的任何一个合并到一个词典中,只考虑前两个列表
classDict = {}
for stu in students:
if not stu in classDict:
classDict[stu] = []
classDict[stu].append(stu)
但无法将其扩展到n(在我的例子中,n=3)列表。defaultdict和zip是您的朋友: 我相信以下方法会奏效
class_dict= defaultdict(lambda: defaultdict(lambda: defaultdict(str)))
for (section, stu, sub) in zip(sections, students, subjects):
l = len(class_dict[section][stu])
class_dict[section][stu][l+1] = sub
如果你真的愿意,你甚至可以在一行中完成
from collections import defaultdict
from functools import partial
class_dict= defaultdict(partial(defaultdict,list))
for (section, student, subject) in zip(sections, students, subjects):
class_dict[section][student].append(subject)
[此处为表意文字:]
这与您请求的结构不同,因为没有任何理由让字典使用整数键控,除非您正在实现稀疏数组(即使这样,也有更好的选择)。如果你真的需要,你可以在事后将列表转换成dicts;列表已由整数设置关键帧
对于那些不知道的人来说,python类型是可调用的,因此在lambda中包装对象创建是多余的。如果以下任何一项有助于或回答您的问题,则可能重复请向上投票并接受拼错某些名称的最佳oneNote。
defaultdict
将函数作为参数str
是一个函数,但defaultdict(str)
不是。可能您缺少一个lambda
?根据@Weeble@MattAlcock您不需要lambda。@Mattalock:如果我运行您的代码>KeyError:'A'
为行子目录[section][stu][l+1]引发=sub
与Matt的注释相同:我认为在调用defaultdict
时需要一个lambda:
,因为它需要一个函数作为参数。问题中的第三维是一个dict,而不是一个列表,尽管它是数字顺序键,它可以这样表示。@mattalock你拒绝阅读问题的英文部分吗答案?我明确地讨论了这一点。@Weeble Python类型是可调用的。@Marcin:您是在什么版本的Python下运行这段代码的?对我来说,collections.defaultdict对象是不可调用的,因此class_dict=defaultdict(defaultdict(list))
引发TypeError:第一个参数必须是可调用的
,这正是Weeble给出的原因。