【问题标题】:Translating a 2D Array to nested dictonary将二维数组转换为嵌套字典
【发布时间】:2015-12-22 16:41:10
【问题描述】:

我正在使用 openpyxl 来读取和写入 xlsx 文件,出于某些数据操作目的,我需要将我的工作表(我用 2D 矩阵表示)翻译成遵循特定格式的字典,这是我的矩阵.

[['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 比较陌生,我相信字典理解是可行的方法,但我不确定如何按名称获取这些 2D 数组值,以便我可以正确构建我的键值对。

【问题讨论】:

  • 二维数组没有名称,您需要通过提供数字索引值来选择想要的数组及其想要的元素来解决内容。
  • 您可以在循环中执行类似my_dict[my_array[0][y]] = my_array[x][y] 的操作。另外,仅供参考,您的字典中的错字。应该看起来像 'Jay;12;M' : {'Name': 'Jay', 'Age': '12' ...

标签: python arrays dictionary openpyxl


【解决方案1】:

假设你想要这种格式:

{'<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的所有行(第一行除外),并为每一行创建一个字典,其键是k的元素,值是当前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))}

【讨论】:

  • 这绝对有效,但它给了我一个包含所有值的键,我只需要字典中的 3 个特定值,所以我会稍微调整一下以使其工作,谢谢。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 2014-12-30
  • 2015-04-04
  • 2013-12-07
  • 2016-10-01
  • 2023-03-24
  • 2016-12-10
  • 2018-02-16
相关资源
最近更新 更多