开发者社区> 问答> 正文

创建一个智能函数以从词典列表中提取值

我有这样的数据列表

data = [
          {
                    "name": "Box 0",
                    "type": "Box",
                    "vals": {
                              "corner1": "0,0,0",
                              "corner2": "0,0,5",
                              "rotate": "0",
                              "scale": "1",
                              "translate": "0,0,0"
                    }
          },
          {
                    "name": "Ovus 1",
                    "type": "Ovus",
                    "vals": {
                              "radiusb": "1",
                              "radiust": "0.5",
                              "rotate": "0",
                              "scale": "1",
                              "translate": "0,0,0"
                    }
          }
]

我想创建一个表格功能

fetch_attributes(name, key)

我可以在其中提供关键属性值的类型,值或比例。

我的问题是scale属性在vals词典中。我可以做一个函数,使它在给我* key = type 时给我类型,而当我要求 key = scale *时,它会自动进入vals字典中。

我的方法

我使用此代码作为名称='Box 0'的示例

obj = [i for i in data if i['name'] == name][0]
key_1 = "['vals']" # If I want complete dict of vals
key_2 = "['vals']['scale']" #If I want only one val out of vals
key_3 = "['type']" # If I want type

result_1 = eval('obj' + key_1)
result_2 = eval('obj' + key_2)
result_3 = eval('obj' + key_3)

我想知道是否存在执行此任务的更好或更多的pythonic方法

编辑

我想要一种也可以帮助或指导创​​建edit_attributes函数的方法

edit_attributes(name, key, value)

问题来源:stackoverflow

展开
收起
is大龙 2020-03-21 18:17:55 450 0
1 条回答
写回答
取消 提交回答
  • 我认为这(现在)可以满足您的需求:

    def fetch_attributes(data, name, key):
        for dct in data:
            if dct['name'] == name:
                obj = dct
                break
        else:
            raise KeyError(f'No object with name {name!r} in data')
    
        if isinstance(obj, dict):
            if key in obj:
                return obj[key]
    
            for value in obj.values():
                if isinstance(value, dict):  # Nested dict?
                    if key in value:
                        return value[key]
    
        raise KeyError(f'{key!r} not in data')
    
    
    print(fetch_attributes(data, 'Box 0', 'vals'))   # -> {'corner1': '0,0,0', 'corner2': '0,0,5', 'rotate': '0', 'scale': '1', 'translate': '0,0,0'}
    print(fetch_attributes(data, 'Box 0', 'scale'))  # -> 1
    print(fetch_attributes(data, 'Box 0', 'type'))   # -> Box
    

    回答来源:stackoverflow

    2020-03-21 18:18:19
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
4个迭代,从批量交...1573957773.pdf 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载