【问题标题】:python: unpacking an array of dictionaries in a matrixpython:解压缩矩阵中的字典数组
【发布时间】:2016-03-02 13:01:55
【问题描述】:

我对 python 比较陌生,一段现有的代码创建了一个类似于下面的对象。这是遗留代码的一部分。不幸的是,我不能改变它。该代码创建了许多类似于以下格式的对象:

[[{'a': 2,'b': 3}],[{'a': 1,'c': 3}],[{'c': 2,'d': 4}]]

我正在尝试创建将此对象转换为矩阵或 numpy 数组。在此特定示例中 - 它将具有三行 (1,2,3) 和 4 列 (a,b,c,d),并在单元格中插入字典值。 (我已经插入了这个矩阵看起来像一个小玩具的例子。但是 - 我不想从头开始重新创建表格,但我正在寻找以矩阵格式转换上述对象的代码)。

我正在努力寻找一种快速简便的方法来做到这一点。非常感谢任何提示或建议。

   a  b  c  d
1  2  3  0  0
2  1  0  3  0
3  0  2  0  4

【问题讨论】:

  • 添加预期输出?
  • 没有a[3] 这样的东西。就连子列表也只有三个元素,a也只有一个。
  • 完全不清楚你在问什么。为您的列表提供所需的输出。

标签: python numpy dictionary


【解决方案1】:

当您需要首先解决方法时,我怀疑您正在关注快速和简单。这不是np.array 或`pandas 的正常输入格式。所以让我们专注于此。

这是一个列表列表;建议使用二维数组。但每个子列表都包含一个字典,而不是值列表。

In [633]: dd=[[{'a': 2,'b': 3}],[{'a': 1,'c': 3}],[{'c': 2,'d': 4}]]
In [634]: dd[0]
Out[634]: [{'b': 3, 'a': 2}]

所以让我们定义一个将字典转换为数字列表的函数。我们可以解决a,b,c,d标签从哪里来的问题,以及是否需要从dd收集它们,稍后。

In [635]: dd[0][0]
Out[635]: {'b': 3, 'a': 2}
In [636]: def mk_row(adict):
    return [adict.get(k,0) for k in ['a','b','c','d']]
   .....: 
In [637]: mk_row(dd[0][0])
Out[637]: [2, 3, 0, 0]

所以现在我们只需要将函数应用到每个子列表

In [638]: [mk_row(d[0]) for d in dd]
Out[638]: [[2, 3, 0, 0], [1, 0, 3, 0], [0, 0, 2, 4]]

这是@Colin 提供给pandas 的那种列表。也可以给np.array

In [639]: np.array([mk_row(d[0]) for d in dd])
Out[639]: 
array([[2, 3, 0, 0],
       [1, 0, 3, 0],
       [0, 0, 2, 4]])

【讨论】:

  • 感谢@hpaulj - 花时间来解决这个问题。我认为下面的解决方案也可能有效 - 只是偶然发现了这个 dd=[[{'a': 2,'b': 3}],[{'a': 1,'c': 3}] ,[{'c': 2,'d': 4}]] a = [b[0] for b in dd] c = pandas.DataFrame(a) c.fillna(0)
  • 我对@9​​87654330@ 的使用不足以了解它接受的各种输入。但是考虑到它的目的,一个字典列表是有意义的。
【解决方案2】:

简单使用:

import pandas as pd
df = pd.DataFrame.from_items([('1', [2, 3, 0,0]), ('2', [1, 0, 3,0]),('3', [0, 2, 0,4])], orient='index', columns=['a', 'b', 'c','d'])


arr = df.values

然后您可以像普通的numpy 数组一样引用它:

print(arr[0,:]) 

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2014-10-09
    • 2020-07-04
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多