【问题标题】:issue with concatenating multidimensional list with python用python连接多维列表的问题
【发布时间】:2017-12-04 01:35:40
【问题描述】:

我在使用函数解析 json 文件时遇到问题。我试图解决我的问题几个小时,但我找不到解决方法:/

这是我正在解析的 json 源代码(我知道我可以删除每个“series_x”上的 []):

{
    "series_1":
    [
        {
            "x": [1,2,4,6,8],
            "y": [1,4,8,12,16]
        }
    ],
    "series_2":
    [
        {
            "x": [1,2,4,6,8],
            "y": [1,4,16,36,42]
        }
    ]
}

我在 Python 中编写了一个函数来返回 x 或 y 的特定值。这个功能很好用。

import json
    def importJson(filePath):
            with open(filePath) as data_file:
                data = json.load(data_file)
                data = data['series_1'][0]['x']
                return data
        print(importJson('jasonfile.json'))

现在这很酷,但函数将始终返回相同的值。所以这有点没有意义。因此,我尝试编写一个将 filePath 和数据列表的多维元素作为参数的函数。注意:我希望此参数包含未定义数量的列表维度,以防我想返回所有“series_1”或其中的特定值“y”。 所以我写了这个:

import json

def importJson(filePath, dataPath):
    with open(filePath) as data_file:
        data = json.load(data_file)
        dataOut = data[dataPath[0]]
        i=1
        while i < len(dataPath):
            dataOut += [dataPath[i]]
            i += 1
        return dataOut

print(importJson('dataSource.json', list(['series_1',0,'x'])))

您可以想象它不起作用,因为不可能像这样连接多维列表。所以 a[0][1] != a[0] + [1] 我尝试了很多东西,但没有任何效果,我觉得解决方案很简单,我就是无法理解它。有人看到可以提供帮助的东西吗? 谢谢!

【问题讨论】:

  • 尝试使用 pprint 模块查看每一步的输出? from pprint import pprint
  • 我不知道您为什么要谈论多维数组。您的输入没有任何内容,我不确定您为什么要介绍它们。查看输入的结构:带有“series_1”之类的键的字典,其中每个值是一个元素的列表,该元素具有带有“x”和“y”之类的键的字典,其中每个值都是数字列表。您需要通过dataPath 在每个级别获得正确的东西。当您到达dataPath(大概是一个列表)的末尾时,您将返回您所拥有的。
  • 也许我没有解释清楚,对此感到抱歉。我希望 te 函数将 jsonfile 中返回的内容作为参数。所以如果我只输入数据['series_1'],没问题它会返回它。问题是我希望这个函数扩展到 Json 的其他节点,这就是为什么我使用 while 来“定义”需要多少个注释来解析和构建解析器,例如 data['series_1'] [0]['x'][0]。这更清楚了吗?

标签: python arrays json multidimensional-array


【解决方案1】:

如果我正确理解了这个问题,那么您的代码中的问题是您试图总结事情,尤其是总结没有意义的事情,例如将“series_1”添加到“x”。我认为您需要做的就是这样:

d = data
for i in dataPath:
    d = d[i]
return d

【讨论】:

  • 实际上并不是一个总和,因为我最后需要的数据格式是这样的 data['series_1'][0]['x'],而不是 data['series_1' ]+[0]+['x']。
  • 是的,我就是这么想的,但是当您说dataOut += ... 时,您的代码正在求和。如果您执行上述操作,我认为这就是您想要的。
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2022-06-16
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多