【问题标题】:Nested dictionaries - obtaining values (Python)嵌套字典 - 获取值(Python)
【发布时间】:2018-01-06 21:59:41
【问题描述】:

我有一个 JSON 文件,从 XML 转换而来,最初是等式:x^2 + 4*x + 4 = 0:

{
  "mrow": {
    "mrow": {
      "msup": {
        "mi": "x",
        "mn": "2"
      },
      "mo": [
        "+",
        "+"
      ],
      "mrow": {
        "mn": "4",
        "mo": "*",
        "mi": "x"
      },
      "mn": "4"
    },
    "mo": "=",
    "mn": "0"
  }
}

当我用 Python 打开这个文件时,我会得到嵌套的字典,如下所示:

{'mrow': {'mrow': {'msup': {'mi': 'x', 'mn': '2'}, 'mo': ['+', '+'], 'mrow': {'mn': '4', 'mo': '*', 'mi': 'x'}, 'mn': '4'}, 'mo': '=', 'mn': '0'}}

有没有一种简单的方法可以只获取表示初始方程的值,以便我再次得到初始方程?

【问题讨论】:

  • json.dump()
  • 您提到这来自 XML。这让我觉得这实际上是MathML 格式。我会检查是否有任何 Python 包可以解析它(mathdom)?
  • 您可以安全地获得具有此表示的初始方程,因为键顺序未保存在 Python 对象中。你可以得到x^2 + 4*x + 4 = 0x^2 + 4*x + 4 0 =,或其他任何东西。
  • 也许尝试解析原始 XML 数据以获得所需的输出

标签: python json dictionary nested


【解决方案1】:

你可以试试这个:

def parse_obj(obj):
    if isinstance(obj, dict):
        items = []
        for key, value in obj.items():
            if key == 'mrow':
                items.append(parse_obj(value))
            elif key == 'msup':
                mi = parse_obj(value['mi'])
                mo = parse_obj(value['mn'])
                items.append("{mi}^{mo}".format(mi=mi, mo=mo))
            elif key in ['mi', 'mo', 'mn']:
                items.append(parse_obj(value))
            else:
                raise NotImplementedError((key, value))
        return " ".join(items)
    elif isinstance(obj, list):
        return " ".join(parse_obj(value) for value in obj)
    else:
        return obj  # a string

带有以下json内容:

text = """\
{
  "mrow": {
    "mrow": {
      "msup": {
        "mi": "x",
        "mn": "2"
      },
      "mo": [
        "+",
        "+"
      ],
      "mrow": {
        "mn": "4",
        "mo": "*",
        "mi": "x"
      },
      "mn": "4"
    },
    "mo": "=",
    "mn": "0"
  }
}"""

json_decoder = json.JSONDecoder(object_pairs_hook=collections.OrderedDict)
obj1 = json_decoder.decode(text)
print(parse_obj(obj1))

你得到:

x^2 + + 4 * x 4 = 0

我觉得"mo": ["+", "+"]有问题……

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多