【问题标题】:Looking for an efficient way to manipulate JSON data寻找一种有效的方式来操作 JSON 数据
【发布时间】:2015-05-26 01:04:35
【问题描述】:

我一直在解析一些 JSON 文件,最终得到了一个字典,其中字符串作为键,元组列表作为值。

dict 具有以下格式:

str1: [(int1, bool), (int2, bool), ... ],
str2: [(int1, bool), (int2, bool), (int3, bool), ... ],
...
strN ...

我想要实现的是一个看起来像这样的表格:

      int1   int2  int3
str1  bool   bool
str2  bool   bool  bool

有没有办法做到这一点,而无需编写一个包含几十个嵌套 fors 和 ifs 的长算法?不是要求为我写那个,只是提示一个正确的方向。

我只是想知道如何将数据处理成类似的格式。不过,如果它能够兼容将其写入 CSV 或理想情况下的 Excel 文件,那就太好了。

【问题讨论】:

  • 那些实际上是 strings,并且您在问如何将它们解析为元组列表的元组,或者您是否已经有了元组列表的元组并且您是询问如何将其映射到表格中?
  • 你真的试过自己写一些代码吗?
  • @abarnert 嗨,数据已经具有上述结构(第一个代码部分)。
  • @JamesMills 不,我没有。这就是为什么我提到我想要一个正确方向的提示,而不是为我写的。只是在寻找想法。
  • @EugeneS:您对数据的说明并不完全清楚。您是否已经解析了看起来像这样的 python 对象,或者只是具有常规结构的字符串?如果您有实际的 Python 对象,您可以打印它们并编辑到您的帖子中吗? str1 和 str2 是字典键还是元组中的项还不清楚。

标签: python json data-structures


【解决方案1】:

如果您已将 JSON 解析为 data,则看起来像

data = {
    'str1': [('int1', 'bool'), ('int2', 'bool')],
    'str2': [('int1', 'bool'), ('int2', 'bool'), ('int3', 'bool')] }

然后您可以将其加载到 Pandas DataFrame 中

import pandas as pd 
df = pd.DataFrame({key:pd.Series(dict(seq)) for key, seq in data.items()}).T

这样

print(df)

产量

      int1  int2  int3
str1  bool  bool   NaN
str2  bool  bool  bool

和

df.to_csv('/tmp/out.csv')

生成包含内容的 CSV

,int1,int2,int3
str1,bool,bool,
str2,bool,bool,bool

【讨论】:

    【解决方案2】:

    好吧,如果您需要遍历它们 - 例如,出于检查或处理目的 - 任何算法都将在 lines*rows 项目中运行,平均而言,您正在解析行和行。

    现在,如果您不太担心性能而是担心可读性,您可以将解析分成一些名称清晰的函数,以完成一些小步骤的操作。即使某些函数仅是提取的for循环,也会提高可读性。

    【讨论】:

      【解决方案3】:

      假设你已经解析成元组列表的元组,你要问的是如何将它们分组到一个表中。

      存储具有稀疏轴的 2D 表的一种明显方法是使用字典,以 int 和 str 值为键。例如:

      d = defaultdict(dict)
      seen_ints = set()
      for s, pairs in rows:
          for i, b in pairs:
              d[s][i] = b
              seen_ints.add(i)
      

      现在,要获取行,您只需迭代 d[s].items()。或者,如果您希望它们按字符串的排序顺序,请迭代 sorted(d[s].items())。每一行都是一个字典;要按所需顺序获取列,只需访问 row[key] for key in seen_ints。 (如果你也想对列进行排序,只需在外循环之前执行seen_ints = sorted(seen_ints)。)

      或者您可以使用 csv.DictWriter 删除 seen_ints 集,然后将每一行 dict 写为 CSV 行。

      【讨论】:

        【解决方案4】:

        看起来很直接,所以;

        • 导入用于 JSON 解析的库
        • 导入用于 CSV 写入的库

        然后,将 JSON 解析为数据结构(可能是 map 或 list 和 array)并通过解析该数据结构将其写入 CSV。

        如果数据结构不符合生成您所需的格式,请使用简单的for loop 来修改和转换数据结构。

        为了提高效率;

        • 与编写您的第一个解析器或编写器相比,使用库通常会在一般情况下提供更高的效率。
        • 将任何数据操作包含在一个夹在解析和写入阶段之间的小循环中,这样您就可以让您的核心算法易于识别和阅读,从而有望提高其效率。

        【讨论】:

        • 您好,感谢您的回答,但这并不能真正回答我的问题。我知道如何导入 json 和 csv 库,并且知道如何使用它们。事实上,我已经有了从 json 文件中解析出来的上述结构。我只是询问一种将这种结构转换为不同结构的方法。
        猜你喜欢
        • 2015-07-16
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多