【问题标题】:Python dictionary operationsPython字典操作
【发布时间】:2018-08-11 18:46:22
【问题描述】:

如何从该字典中删除 data 键并将其转换为 递归使用python函数?

request = {"data":{"a":[{"data": {"b": {"data": {"c": "d"}}}}]}}

response = {"a": [{"b":{"c": "d"}}]}

【问题讨论】:

  • 您能否向我们展示您迄今为止所做的尝试以及为什么不起作用,以便我们为您提供帮助?
  • 你的描述有问题,如果有一个“数据”键又是另一个键,这个级别怎么办?
  • 我需要忽略其他键,我只关心“数据”键,它的值类型是列表或字典。

标签: python dictionary


【解决方案1】:

是的,您可以递归地执行此操作,如果您只有列表和字典,那么这非常简单。测试对象类型和容器,递归:

def unwrap_data(obj):
    if isinstance(obj, dict):
        if 'data' in obj:
            obj = obj['data']
        return {key: unwrap_data(value) for key, value in obj.items()}

    if isinstance(obj, list):
        return [unwrap_data(value) for value in obj]

    return obj

就个人而言,我喜欢使用the @functools.singledispatch() decorator 创建每个类型的函数来完成相同的工作:

from functools import singledispatch

@singledispatch
def unwrap_data(obj):
    return obj

@unwrap_data.register(dict)
def _handle_dict(obj):
    if 'data' in obj:
        obj = obj['data']
    return {key: unwrap_data(value) for key, value in obj.items()}

@unwrap_data.register(list)
def _handle_list(obj):
    return [unwrap_data(value) for value in obj]

这使得添加其他类型以供以后处理更容易。

演示:

>>> request = {"data":{"a":[{"data": {"b": {"data": {"c": "d"}}}}]}}
>>> unwrap_data(request)
{'a': [{'b': {'c': 'd'}}]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2015-02-27
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多