首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python数据检索

Python数据检索
EN

Stack Overflow用户
提问于 2015-01-07 13:15:10
回答 2查看 328关注 0票数 0

我目前正在尝试从JSON行中提取数据,并将数据存储在数组中。数据是一个数学方程,有运算符、组和值。

代码语言:javascript
复制
    {
    "rightArgument": {
        "cell": "C6",
        "value": 13394.5,
        "type": "cell"
    },
    "leftArgument": {
        "rightArgument": {
            "value": "20",
            "type": "constant"
        },
        "leftArgument": {
            "rightArgument": {
                "value": "90",
                "type": "constant"
            },
            "leftArgument": {
                "value": "100",
                "type": "constant"
            },
            "type": "operation",
            "operator": "+"
        },
        "type": "operation",
        "operator": "+"
    },
    "type": "operation",
    "operator": "+"
}

但是,我能够提取第一个运算符和值(+和13394.5),但是当试图向下导航时,我会抛出许多错误。我想知道是否有人可以帮助描述或帮助我的代码如何做到这一点?

目前,我有以下Python代码:

代码语言:javascript
复制
def _getCurrentOperator(data): # function to find current scope operator, pass in the current scope ie data, rightargument, leftargument


    list.append(data["operator"])
    data = data["rightArgument"]
    list.append(data["value"])
    data = data["leftArgument"]
    _getCurrentOperator(data) 

编辑:

在我的一些数学公式中,我必须考虑括号,这些括号由JSON文件中的类型:"group“显示:下面是JSON文件的一个示例:

代码语言:javascript
复制
{
    "rightArgument": {
        "rightArgument": {
            "value": "2",
            "type": "constant"
        },
        "leftArgument": {
            "value": "90",
            "type": "constant"
        },
        "type": "operation",
        "operator": "/"
    },
    "leftArgument": {
        "rightArgument": {
            "arguments": [],
            "name": "pi",
            "type": "function"
        },
        "leftArgument": {
            "rightArgument": {
                "argument": {
                    "rightArgument": {
                        "value": "100",
                        "type": "constant"
                    },
                    "leftArgument": {
                        "rightArgument": {
                            "cell": "C7",
                            "value": 13604.5,
                            "type": "cell"
                        },
                        "leftArgument": {
                            "rightArgument": {
                                "value": "20",
                                "type": "constant"
                            },
                            "leftArgument": {
                                "value": "90",
                                "type": "constant"
                            },
                            "type": "operation",
                            "operator": "/"
                        },
                        "type": "operation",
                        "operator": "*"
                    },
                    "type": "operation",
                    "operator": "+"
                },
                "type": "group"
            },
            "leftArgument": {
                "value": "100",
                "type": "constant"
            },
            "type": "operation",
            "operator": "+"
        },
        "type": "operation",
        "operator": "+"
    },
    "type": "operation",
    "operator

": "+"
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-07 13:25:34

问题是您正在重新定义data,所以当您试图获得左参数时,data已经是正确的参数。另外,当左参数是一个值时,您应该停止递归。

试试这个:

代码语言:javascript
复制
def _getCurrentOperator(data):
    if "operator" in data:               # case 1: operator
        list.append(data["operator"])
        right = data["rightArgument"]    # other var name
        list.append(right["value"])
        left = data["leftArgument"]      # other var name
        _getCurrentOperator(left) 
    else:                                # case 2: value
        list.append(data["value"])

根据您的测试数据,list['+', 13394.5, '+', '20', '+', '90', '100']的形式出现

当然,只有在正确的参数始终是值而不是其他运算符的情况下,这仍然有效。(顺便说一句,你似乎也在左右交换。)对于这种情况,您可以尝试如下:

代码语言:javascript
复制
def _getCurrentOperator(data):
    if "operator" in data:
        list.append(data["operator"])
        _getCurrentOperator(data["leftArgument"]) 
        _getCurrentOperator(data["rightArgument"]) 
    else:
        list.append(data["value"])

要处理所有其他类型的节点,只需添加更多的情况,例如(可能不完整):

代码语言:javascript
复制
def _getCurrentOperator(data):
    if data["type"] == "operation":
        list.append(data["operator"])
        _getCurrentOperator(data["rightArgument"]) 
        _getCurrentOperator(data["leftArgument"]) 
    elif data["type"] == "group":
        _getCurrentOperator(data["argument"]) 
    elif data["type"] == "function":
        list.append(data["name"]) # TODO do something with arguments
    else:
        list.append(data["value"])
票数 2
EN

Stack Overflow用户

发布于 2015-01-07 13:22:12

python模块将大大简化这一工作。

在调用raw = json.dumps(<your-data>)之后,然后是decoded = json.loads(raw),您可以更容易地使用JSON。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27820365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档