【问题标题】:Python get a dict entry containing certain fieldPython得到一个包含特定字段的dict条目
【发布时间】:2017-12-04 11:12:54
【问题描述】:

我在 Python 中有一个嵌套的字典,其中包含 YAML 结构,例如

  - id: left_time
    type: u2
    doc: Time left

我想获得像 {id: doc} 这样的对。对于这个例子,我希望它是:{“left_time”:“剩余时间”}。问题是我需要递归地遍历它们。

我的尝试是

def get_dict_recursively(search_dict, field):
    fields_found = []

    name = ""

    for key, value in search_dict.items():

        if key == "id":
            name = value

        if key == field:
            fields_found.append({name: value})

        elif isinstance(value, dict):
            results = get_dict_recursively(value, field)
            for result in results:
                fields_found.append({name: result})

        elif isinstance(value, list):
            for item in value:
                if isinstance(item, dict):
                    more_results = get_dict_recursively(item, field)
                    for another_result in more_results:
                        fields_found.append({name: another_result})

    return fields_found

这样称呼它

get_dict_recursively(dict, "doc")

在哪里

dict = {
  meta:
    id: foo
    title: Foo
  types:
    data:
      seq:
        - id: left_time
          type: u2
          doc: Time left
    gps:
      seq:
        - id: gps_st
          type: b2
        - id: sats
          type: b6
          doc: Number of satellites
}

有一个错误,但我找不到。

【问题讨论】:

  • 我是否理解正确,您描述的最后一个 dict 的结果应该是 {"left_time": "Time left", "sats": "Number of satellites"}?
  • @pho7,没错。

标签: python dictionary recursion


【解决方案1】:

让我们首先将您的示例数据声明为dict

data = {
    "meta": {
        "id": "foo",
        "title": "Foo"
    },
    "types": {
        "data": {
            "seq": [
                {
                    "id": "left_time",
                    "type": "u2",
                    "doc": "Time left"
                }
            ]
        },
        "gps": {
            "seq": [
                {
                    "id": "gps_st",
                    "type": "b2"
                },
                {
                    "id": "sats",
                    "type": "b6",
                    "doc": "Number of satellites"
                }
            ]
        }
    }
}

接下来,我们可以将您的递归函数简化为如下所示:

def extract_docs(data):
    result = []
    if isinstance(data, list):
        for d in data:
            result += extract_docs(d)
    elif isinstance(data, dict):
        if "id" in data and "doc" in data:
            result.append((data["id"], data["doc"]))
        else:
            for d in data.values():
                result += extract_docs(d)
    return result

这样你就得到了

>>> dict(extract_docs(data))
{'sats': 'Number of satellites', 'left_time': 'Time left'}

【讨论】:

  • 所以?这就是你一直在寻找的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2018-06-21
  • 2011-01-30
  • 2017-12-07
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多