首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JSON中带有List元素的Python Chained ()方法

在JSON中带有List元素的Python Chained ()方法
EN

Stack Overflow用户
提问于 2017-07-13 10:01:31
回答 2查看 679关注 0票数 1

Python 2.7

我有一个JSON源代码,它并不总是返回预期键的完整列表。我使用链式gets()来解决这个问题。

代码语言:javascript
复制
d = {'a': {'b': 1}}

print(d.get('a', {}).get('b', 'NA'))
print(d.get('a', {}).get('c', 'NA'))

>>> 1
>>> NA

然而,一些数据列在一个列表中:

代码语言:javascript
复制
d = {'a': {'b': [{'c': 2}]}}

print(d['a']['b'][0]['c'])

>>> 2

我不能使用get()方法来解释这一点,因为列表不支持get()属性:

代码语言:javascript
复制
d.get('a', {}).get('b', []).get('c', 'NA')

>>> AttributeError: 'list' object has no attribute 'get'

除了捕获数百个潜在的KeyErrors之外,是否有一种更好的方法来解释潜在的缺失['c'] (类似于上面的链式get()构造)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 17:02:27

我同意@stovfl,编写自己的查找函数是可行的。尽管如此,我并不认为递归实现是必要的。以下几点应能发挥良好的作用:

代码语言:javascript
复制
def nested_lookup(obj, keys, default='NA'):
    current = obj
    for key in keys:
        current = current if isinstance(current, list) else [current]
        try:
            current = next(sub[key] for sub in current if key in sub)
        except StopIteration:
            return default
    return current


d = {'a': {'b': [{'c': 2}, {'d': 3}]}}

print nested_lookup(d, ('a', 'b', 'c'))  # 2
print nested_lookup(d, ('a', 'b', 'd'))  # 3
print nested_lookup(d, ('a', 'c'))       # NA

类方法似乎不太好,因为您将创建大量不必要的对象,如果您试图查找一个不是叶的节点,那么您将得到一个自定义对象,而不是实际的节点对象。

票数 2
EN

Stack Overflow用户

发布于 2017-07-14 16:36:49

问题:我不能用get()。因为列表不支持get()。

  1. 例如,您可以实现自己的list.get(): 类myGET(object):def __init__(self,data):if isinstance(data,dict):self.__dict__.update(data) if isinstance(data,list):self.__dict__.update(d) def get(self,key,default=None):if hasattr(self,(键):_attr = object.__getattribute__(self,key)如果isinstance( _attr,(list,dict)):返回myGET(_attr),否则:返回默认的d= {'a':{'b':{'c':2}} myGET(d).get('a',( {}).get('b',[]).get('c',' NA ') >>> 2 myGET(d).get('a',{}).get('b',[]).get('d','NA') >>> NA
  2. 递归解决方案,不需要链接,例如: def get( _dict,子键,默认值):def _get(_dict,key,def):如果键==子键深: if == len(子键)- 1:返回_dict else:返回_get(_dict,None,def+ 1) elif isinstance(_dict,对于_dict中的k: match = _get(_dictk,k,deep)如果匹配:返回match elif isinstance(_dict,list):对于_dict中的e: match = _get(e,None,deep)如果匹配:返回匹配如果不是isinstance(子键,(tuple,tuple,(列表):subkey = (subkey) _r = _get(_dict,None,0)如果不是_r:返回默认的_r :返回_r get(d,'c',' NA ') >>> 2 get(d,'d','NA') >>> NA# get a if b= {'a':{b‘’:{'a':3} get(d,‘c’:2}}get(d,(‘d’,‘b’,)‘’),'NA') >>> 3

用Python测试的:3.4.2和2.7.9

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

https://stackoverflow.com/questions/45077397

复制
相关文章

相似问题

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