从Excel工作簿制作嵌套字典

问题描述

我必须从excel工作簿创建一个嵌套字典。我正在使用openpyxl库。 Excel文件如下所示:

for

我想实现这样的目标:

let l = [];

for (let x = 0; x < 3; ++x) {
  l.push(function () { console.log(x); });
}

l[0]();  // prints 0
l[1]();  // prints 1
l[2]();  // prints 2

到目前为止,我要做的是从标题获取键列表,从行中获取值列表并将它们压缩在一起:

MarkLine

但是它不会产生嵌套的字典。我实现的是:

|   score    |     lat     |      lon     | loc.country|  loc.city   |  loc.street  |   loc.st_nr  | ...
| ---------- | ----------- | ------------ | ---------- | ----------- | ------------ | ------------ | ...
|     2      |     51      |      19      |  Poland    |   Warsaw    |    Cicha     |      1       | ...
|     4      |     52      |      18      |  Poland    |   Cracow    |    Dluga     |      2       | ...
|    ...     |     ...     |     ...      |    ...     |     ...     |     ...      |     ...      | ...

如何修改它以获得预期的结果?

解决方法

并不是最好的选择,但没有麻烦去安装xD软件包

输入:

mydict = {
    "score": 2,"lat": 51,"lon": 19,"loc.country": "Poland","loc.city": "Warsaw","loc.street": "Cicha","loc.st_nr": 1
}

功能

mydict = {}
for key in dict.keys():
    key = key.split('.')
    if key.__len__() == 2:
        if key[0] not in mydict.keys():
            mydict[key[0]] = {}
        if key[1] not in mydict.keys():
            mydict[key[0]][key[1]] = dict[key[0] + "." + key[1]]
    else:
        mydict[key[0]] = dict[key[0]]

print(mydict)

输出:

{'score': 2,'lat': 51,'lon': 19,'loc': {'country': 'Poland','city': 'Warsaw','street': 'Cicha','st_nr': 1}}
,

您不能仅使用dict()来完成此操作,因为此功能只能使用您的键和值创建一个简单的字典。如果要降低带有点的变量名的级别,则必须使用自定义函数。

如果传递变量名列表和值列表,则下面的函数将在所有变量中嵌套一个点。

def nest_dict(keys,values):
    d = {}
    for i in range(len(keys)):
        if '.' in keys[i]:
            l1,l2 = keys[i].split('.')[0],''.join(keys[i].split('.')[1:])
            try:
                d[l1][l2]=values[i]
            except:
                d[l1]={l2:values[i]}
        else:
            d[keys[i]]=values[i]
    return d

对于数据,您将像这样传递标题和行:

header = ["score","lat","lon","loc.country","loc.city","loc.street","loc.st_nr"]
row = [2,51,19,"Poland","Warsaw","Cicha",1]

print(nest_dict(header,row))

哪个返回字典

{'score': 2,'st_nr': 1}
}

请注意,这仅适用于一个级别。如果您的变量名带有多个点,而这些点必须更深一层,则必须调整该函数。