Python 如何将两个列表组合成词典

Python 如何将两个列表组合成词典,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,我有以下问题,我有两个列表需要组成一个字典 header=["a","b","c"] list=[1,2,4,5,7,9,6,5,1,5,8,12] 这就是我希望结果的样子 { outer1:{ inner1:{ "a":1, "b":2, "c":4, }, inner2:{ "a&quo

我有以下问题,我有两个列表需要组成一个字典

header=["a","b","c"]
list=[1,2,4,5,7,9,6,5,1,5,8,12]
这就是我希望结果的样子

{
  outer1:{
    inner1:{
      "a":1,
      "b":2,
      "c":4,
    },
    inner2:{
      "a":5,
      "b":7,
      "c":9,
    },
    }
  outer2:{
     inner1:{
      "a":6,
      "b":5,
      "c":1,
    },
    inner2:{
      "a":5,
      "b":8,
      "c":12,
    },

  }
}

如果有任何需要澄清或评论的地方,我将感谢您的帮助

下面是我如何试图解决这个问题

dictionary = {"outer" + str(h+1): {"inner" + str(i): {
            header[j]: list[h*len(header)+j] for j in range(len(header))} for i in
            range(3)} for h
            in range(len(list) // len(header))}

如果你想考虑更多的情况,你可能需要完成代码,但是这里有一个想法:

header=["a","b","c"]
my_list=[1,2,4,5,7,9,6,5,1,5,8,12]

dic = {}

for i in range(int(len(my_list)/6)):
    sublist = my_list[:6]
    my_list = my_list[6:]
    
    d1 = {"a":sublist[0], "b":sublist[1], "c":sublist[2]}
    d2 = {"a":sublist[3], "b":sublist[4], "c":sublist[5]}
    
    dic["outer"+str(i+1)] = {"inner1":d1, "inner2":d2}

print(dic)

如果你想考虑更多的情况,你可能需要完成代码,但是这里有一个想法:

header=["a","b","c"]
my_list=[1,2,4,5,7,9,6,5,1,5,8,12]

dic = {}

for i in range(int(len(my_list)/6)):
    sublist = my_list[:6]
    my_list = my_list[6:]
    
    d1 = {"a":sublist[0], "b":sublist[1], "c":sublist[2]}
    d2 = {"a":sublist[3], "b":sublist[4], "c":sublist[5]}
    
    dic["outer"+str(i+1)] = {"inner1":d1, "inner2":d2}

print(dic)

这将创建您想要的字典:

header_raw=["a","b","c"]
li=[1,2,4,5,7,9,6,5,1,5,8,12]

header=header_raw*int(len(li) / len(header_raw))

len_r = len(header_raw)
iterations = int(len(li)/len(header_raw))
ind2_iterations = int(iterations/2)

{f"outer {index}": {f"inner {ind2}": {header[i+index*len_r]:li[i+(((index*2)+ind2)*len_r)] for i in range(len_r)} for ind2 in range(0,ind2_iterations)} for index in range(0,ind2_iterations)}
首先,使两个列表的大小相同。 然后创建一些帮助器变量,帮助您遍历深度3的dict。
如果没有听写理解,它看起来会更好,但它可能会帮你解决问题。

这将创建一个你想要的字典:

header_raw=["a","b","c"]
li=[1,2,4,5,7,9,6,5,1,5,8,12]

header=header_raw*int(len(li) / len(header_raw))

len_r = len(header_raw)
iterations = int(len(li)/len(header_raw))
ind2_iterations = int(iterations/2)

{f"outer {index}": {f"inner {ind2}": {header[i+index*len_r]:li[i+(((index*2)+ind2)*len_r)] for i in range(len_r)} for ind2 in range(0,ind2_iterations)} for index in range(0,ind2_iterations)}
首先,使两个列表的大小相同。 然后创建一些帮助器变量,帮助您遍历深度3的dict。 如果没有听写理解,它看起来会更好,但它可能会帮助你解决问题。

这里有一个基于听写理解的方法。您只需根据构建输出字典所遵循的标准对其进行参数化,即外部循环和内部循环的迭代次数:

from itertools import islice, repeat

header=["a","b","c"]
l=iter([1,2,4,5,7,9,6,5,1,5,8,12])

d = {}
for i in range(2):
    d_temp = {}
    for j, head in enumerate(repeat(header,2)):
        d_temp[f'inner{j}'] = dict(zip(head,islice(l,0,3)))
    d[f'outer{i}'] = d_temp

这是一个基础的。您只需根据构建输出字典所遵循的标准对其进行参数化,即外部循环和内部循环的迭代次数:

from itertools import islice, repeat

header=["a","b","c"]
l=iter([1,2,4,5,7,9,6,5,1,5,8,12])

d = {}
for i in range(2):
    d_temp = {}
    for j, head in enumerate(repeat(header,2)):
        d_temp[f'inner{j}'] = dict(zip(head,islice(l,0,3)))
    d[f'outer{i}'] = d_temp


可扩展为任意数量的头、值和外部指令的解决方案


  • generate\u internal\u dicts
    获取一个标题列表和一个
    值生成器,从
    值中消耗(最多)
    标题
    值的计数,并将其压缩到dicts中,例如
    {a':1,'b':2,'c':4}
    直到
    值用完为止
  • generate_nested_dict
    将该生成器嵌套到所需的结构中,直到
    内部dict_生成器中的内容用完为止

可扩展为任意数量的头、值和外部指令的解决方案


  • generate\u internal\u dicts
    获取一个标题列表和一个
    值生成器,从
    值中消耗(最多)
    标题
    值的计数,并将其压缩到dicts中,例如
    {a':1,'b':2,'c':4}
    直到
    值用完为止
  • generate_nested_dict
    将该生成器嵌套到所需的结构中,直到
    内部dict_生成器中的内容用完为止


请举例说明您解决问题的尝试。如果列表长度为15,预期输出是什么?@sushanth我已更新我的解决方案,请检查它。请举例说明您解决问题的尝试。如果列表长度为15,预期输出是什么?@sushanth我已更新我的解决方案,请检查它这是硬编码这个例子的输出结构通常是不好的,因为它只适用于这个例子。我的想法是给出一个简单的例子。代码可以而且应该改进。这种糟糕的做法如果标题有1000多个项目,这将很难处理。对于本例,这很好,但可以解决更大的问题。这是对本例的输出结构进行硬编码,通常是糟糕的做法,因为它只适用于这个例子,所以我的想法是给出一个简单的例子。代码可以而且应该改进。这种不好的做法如果标题有1000多个项目,这将很难处理。对于本例,这很好,但可以解决更大的问题。我不认为这个答案是完整的。你从哪里获得标题的值?你需要更正什么吗?对,标题应该是header_raw,它还在我的jupyter会话中。谢谢你的提示!我更新了我的解决方案如果标题有29项,我的意思是len(header)=29,列表的len为4060,即len(li)=4060,我如何修改您的答案以适应这种情况,外部循环从1到14开始,内部循环从10到60(10,60,5)我的意思是内部循环类似于内部10,内部15,内部20。。。。,Inner55我不认为这个答案是完整的,你从哪里得到header的值?你需要更正什么吗?对,标题应该是header_raw,它还在我的jupyter会话中。谢谢你的提示!我更新了我的解决方案如果标题有29项,我的意思是len(header)=29,列表的len为4060,即len(li)=4060,我如何修改您的答案以适应这种情况,外部循环从1到14开始,内部循环从10到60(10,60,5)我的意思是内部循环类似于内部10,内部15,内部20。。。。,Inner55如果我的场景中标题有29个项目,我的意思是len(标题)=29,值的len为4060,即len(值)=4060,我如何修改您的答案以适应这种情况,外部循环从1到14开始,内部循环从10到60(10,60,5)我的意思是内部循环类似于内部10,内部15,内部20。。。。,inner55
generate\u inner\u dicts()
与那些规范一样可以正常工作
generate_nested_dicts()
需要更改为
internal_count
。我编辑了我的答案来匹配它。工作得很有魅力,谢谢如果我的场景标题有29个项目,我的意思是len(header)=29,值的len为4060,即len(values)=4060,我如何修改你的答案以适应这种情况,外循环从1到14开始,内循环从10到60(10,60,5)我的意思是内循环像内循环一样,inner15、inner20、…、inner55
generate_inner_dicts()
将与这些规范一样正常工作
generate_nested_dicts()
需要更改为
internal_count
。我编辑了我的答案来匹配它。工作很有魅力,谢谢