Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将3个列表合并到一个字典(具有唯一元素) 用Python编写的代码_Python - Fatal编程技术网

如何将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给出的原因。