将二维数组转换为嵌套字典
Translating a 2D Array to nested dictonary
我正在使用 openpyxl 读取和写入 xlsx 文件,出于某些数据操作目的,我需要将我的工作表(我在二维矩阵中表示)翻译成遵循特定格式的字典,这里是我的矩阵。
[['Name', 'Age', 'Gender', 'Height', 'Hair Color'],
['Jay', '12', 'M', '123cm', 'Black'],
['Marie', '13', 'F', '100cm', 'Red'],
['Dan', '16', 'M', '200cm', 'Brown']
]
我想翻译它,使生成的字典看起来像:
{
{ 'Jay;12;M' : 'Name': 'Jay', 'Age': '12', 'Gender': 'M', 'Height': '123cm', 'Hair Color' : 'Black'},
{ 'Marie;13;F' : 'Name': 'Marie', 'Age': '13', 'Gender': 'F', 'Height': '100cm', 'Hair Color' : 'Red'},
{ 'Dan;16;M' : 'Name': 'Dan', 'Age': '16', 'Gender': 'M', 'Height': '200cm', 'Hair Color' : 'Brown'},
}
我对 Python 比较陌生,我相信字典理解是可行的方法,但我不确定如何按名称获取这些二维数组值,以便构建我的键值正确配对。
假设您想要这种格式:
{'<name>;<age>;<gender>': {'Name': <name>, 'Age': <age>, 'Gender': <gender>, 'Height': <height>: 'Hair Color': <hair_color>}}
拥有:
l
: 你的多维数组
k
:第一行(键)
试试这个:
{reduce(lambda x, y : '{0};{1}'.format(x,y), l[j]):{k[i]: l[j][i] for i in range(len(k))} for j in range(1, len(l))}
这个列表理解遍历l
的所有行(第一行除外),并为每一行创建一个字典,其键是[的元素=14=],值是当前 l
行的元素。
更新
您可以将另一个可迭代对象传递给 reduce
函数而不是 l[j]
(完整行)。对于您的情况可能是:l[j][:3]
而不是 l[j]
,请参阅 slices 的用法。
所以上面应该有:reduce(lambda x, y : '{0};{1}'.format(x,y), l[j][:3])
.
此外,使用zip()可以使内部字典的创建更加优雅:
r = {reduce(lambda x, y : '{0};{1}'.format(x,y), l[j][:3]):{t[0]: t[1] for t in zip(k, l[j])} for j in range(1, len(l))}
我正在使用 openpyxl 读取和写入 xlsx 文件,出于某些数据操作目的,我需要将我的工作表(我在二维矩阵中表示)翻译成遵循特定格式的字典,这里是我的矩阵。
[['Name', 'Age', 'Gender', 'Height', 'Hair Color'],
['Jay', '12', 'M', '123cm', 'Black'],
['Marie', '13', 'F', '100cm', 'Red'],
['Dan', '16', 'M', '200cm', 'Brown']
]
我想翻译它,使生成的字典看起来像:
{
{ 'Jay;12;M' : 'Name': 'Jay', 'Age': '12', 'Gender': 'M', 'Height': '123cm', 'Hair Color' : 'Black'},
{ 'Marie;13;F' : 'Name': 'Marie', 'Age': '13', 'Gender': 'F', 'Height': '100cm', 'Hair Color' : 'Red'},
{ 'Dan;16;M' : 'Name': 'Dan', 'Age': '16', 'Gender': 'M', 'Height': '200cm', 'Hair Color' : 'Brown'},
}
我对 Python 比较陌生,我相信字典理解是可行的方法,但我不确定如何按名称获取这些二维数组值,以便构建我的键值正确配对。
假设您想要这种格式:
{'<name>;<age>;<gender>': {'Name': <name>, 'Age': <age>, 'Gender': <gender>, 'Height': <height>: 'Hair Color': <hair_color>}}
拥有:
l
: 你的多维数组k
:第一行(键)
试试这个:
{reduce(lambda x, y : '{0};{1}'.format(x,y), l[j]):{k[i]: l[j][i] for i in range(len(k))} for j in range(1, len(l))}
这个列表理解遍历l
的所有行(第一行除外),并为每一行创建一个字典,其键是[的元素=14=],值是当前 l
行的元素。
更新
您可以将另一个可迭代对象传递给 reduce
函数而不是 l[j]
(完整行)。对于您的情况可能是:l[j][:3]
而不是 l[j]
,请参阅 slices 的用法。
所以上面应该有:reduce(lambda x, y : '{0};{1}'.format(x,y), l[j][:3])
.
此外,使用zip()可以使内部字典的创建更加优雅:
r = {reduce(lambda x, y : '{0};{1}'.format(x,y), l[j][:3]):{t[0]: t[1] for t in zip(k, l[j])} for j in range(1, len(l))}