2017-09-07 21 views
-1

我无法将2d列表转换为2d字典。在此之前,我还没有用过很多2d字典,所以请耐心等待。我只是想知道为什么这会不断拉起KeyError。在这个简单的例子我想字典看起来像{性别:{名称:[食品,颜色,数量]}}使用for循环将列表转换为2d字典

2dList = [['male','josh','chicken','purple','10'], 
      ['female','Jenny','steak','blue','11']] 
    dict = {} 
    for i in range(len(2dList)): 
     dict[2dList[i][0]][2dList[i][1]] = [2dList[i][2], 2dList[i][3], 2dList[i][4]] 

我不断收到错误消息:KeyError异常:“男性”。我知道这是如何为1d字典添加密钥,但我不确定2d字典。我始终认为它是:

dictionary_name[key1][key2] = value 
+3

您能分享您的预期结果吗? – voidpro

+0

最好用三个样品而不是两个样品,因为它会更好地说明您的挑战。 *提示*:您不能有重复的密钥。 – Alexander

+2

好吧,你无论如何都不能有一个名为2dList的变量。如果你的问题得到解答的话, – rahul

回答

1

你可以试试这个:)如果你有你的List

01多个 malefemale它也将工作
List = [['male','josh','chicken','purple','10'], 
     ['female','Jenny','steak','blue','11']] 


d = {} 

for l in List: 
    gender = l[0] 
    name = l[1] 
    food = l[2] 
    color = l[3] 
    number = l[4] 

    if gender in d: # if it exists just add new name by creating new key for name 
     d[gender][name] = [food,color,number] 
    else: # create new key for gender (male/female) 
     d[gender] = {name:[food,color,number]} 
0

你得到一个KeyError因为你试图用male访问词典中不存在的项作为重点

可以使用defaultdict代替dict

from collections import defaultdict 

2dList = [['male','josh','chicken','purple','10'], 
      ['female','Jenny','steak','blue','11']] 

dict = defaultdict(list) 
for i in range(len(2dList)): 
    dict[2dList[i][0]][2dList[i][1]] = [2dList[i][2], 2dList[i][3], 2dList[i][4]] 
0

试试这个

twodList = [['male','josh','chicken','purple','10'], 
      ['female','Jenny','steak','blue','11']] 
dic = {twodList[i][0]: {twodList[i][1]: twodList[i][2:]} for i in range(len(twodList))} 

正如在评论中提到一个人,你不能开始与数字的变量。

1

您正在尝试构建嵌套字典。但是没有明确地初始化第二层字典。你需要每次都这样做,遇到一个新的密钥。顺便说一句,2dlist是一种在python中声明变量的错误方法。这应该为你工作:

dList = [['male','josh','chicken','purple','10'], 
     ['female','Jenny','steak','blue','11']] 
dict = {} 
for i in range(len(dList)): 
    if not dList[i][0] in dict.keys(): 
     dict[dList[i][0]] = {} 
    dict[dList[i][0]][dList[i][1]] = [dList[i][2], dList[i][3], dList[i][4]] 
print(dict) 
1

为了获得更多或更少的“理智”的结果使用以下(字典的列表,每个字典是格式{gender: { name: [food, color, number] }}):

l = [['male','josh','chicken','purple','10'], ['female','Jenny','steak','blue','11']] 
result = [{i[0]: {i[1]:i[2:]}} for i in l] 
print(result) 

输出:

[{'male': {'josh': ['chicken', 'purple', '10']}}, {'female': {'Jenny': ['steak', 'blue', '11']}}] 
0
list1=[['male','josh','chicken','purple','10'],['female','Jenny','steak','blue','11'],['male','johnson','chicken','purple','10'],['female','jenniffer','steak','blue','11']] 
dict = {} 
for i in range(len(list1)): 
    if list1[i][0] in dict: 
     if list1[i][1] in dict[list1[i][0]]: 
      dict[list1[i][0]][list1[i][1]] = [list1[i][2], list1[i][3], list1[i][4]] 
     else: 
      dict[list1[i][0]][list1[i][1]] = {} 
      dict[list1[i][0]][list1[i][1]] = [list1[i][2], list1[i][3], list1[i][4]] 
    else: 
     dict[list1[i][0]] = {} 
     if list1[i][1] in dict[list1[i][0]]: 
      dict[list1[i][0]][list1[i][1]] = [list1[i][2], list1[i][3], list1[i][4]] 
     else: 
      dict[list1[i][0]][list1[i][1]] = {} 
      dict[list1[i][0]][list1[i][1]] = [list1[i][2], list1[i][3], list1[i][4]] 
print dict 

上方的一个,给出以下输出: { “男性”:{ “乔希”:[ “鸡”, “紫色”, “10”], “约翰逊”:[ “鸡”,”紫色”, “10”]}, “女性”:{ “jenniffer”:[ “牛排”, “蓝”, “11”], “珍妮”:[ “牛排”, “蓝”, “11”]} }