从Dict里面的dict里面获取数据

时间:2015-09-21 07:12:19

标签: python list dictionary elasticsearch

我有来自ElasticSearch的输出值,其形式为

u'hits':
       {
          u'hits':
              [
                  {
                      u'_score': 1.0, u'_type': u'timer_data',
                      u'_id': u'AU_uJ1dk4uyHlwrlFlQv',
                      u'_source': {
                            u'std': u'0', u'upper': u'62.688',
                            u'lower': u'62.688', u'count_90': u'1',
                            u'tgt': u'duration', u'grp': u'request',
                            u'sum_90': u'62.688', u'sum': u'62.688',
                            u'median': u'62.688', u'count': u'1',
                            u'mean_90': u'62.688', u'sum_squares': u'3929.7853440000004',
                            u'ns': u'gunicorn', u'act': u'',
                            u'upper_90': u'62.688', u'sum_squares_90': u'3929.7853440000004',
                            u'count_ps': u'0.1', u'@timestamp': u'1442809600000',
                            u'mean': u'62.688'
                      },
                      u'_index': u'statsd-2015.09.21'
                  }
              ],
              u'total': 1, u'max_score': 1.0
          },
          u'_shards': {
              u'successful': 5, u'failed': 0, u'total': 5
          },
          u'took': 2, u'timed_out': False
      }

我想访问u'_source'字典中的数据,但除了以下内容之外找不到任何正确的方法。

anoval = output[u'hits'][u'hits']
print type(anoval)
# print output[u'hits'][u'hits']
anoval = anoval[0]
print type(anoval)

我想知道是否还有其他更有效的方法来执行此操作,而弹性搜索输出将作为python中的词典

2 个答案:

答案 0 :(得分:1)

尝试以下方法递归迭代数据结构并返回搜索到的值。

def search_multiDS(search_DS, searchfor):
    if isinstance(search_DS, dict):
        if searchfor in search_DS:
            return search_DS['_source']
        else:
            for key, value in search_DS.items():
                return search_multiDS(value, searchfor)
    if isinstance(search_DS, list):
        for item in search_DS:
            return search_multiDS(item, searchfor)
    else:
        return None

print search_multiDS(s, '_source')

答案 1 :(得分:1)

您的'_source'字典在列表中。因此,您必须访问其中列出的第一项才能访问'_source' 所以试试:

['hits']['hits'][0]['_source']