python json返回...的列表(双链接的dicts)?如何搜索键获取值?

时间:2013-07-23 04:50:49

标签: python json

我有一个看起来像这样的json结构:

 hrl=
 { "hourly": [
 {
 "FCT":{
       "time":"",
       "cvl": "6am"
       },
  "wind":"brzy",
  "tmp":{
        "brm":"hot",
        "cel":"37"
       },
  "FCT":{
        "time":"",
        "cvl":"7am"
        }
   }
        .... list continues ..
  ]
  }

所需的输出是小时(cvl)和tmp

的列表

我尝试了各种列表组合,类似于:     CVL = [ v for k,v in parsed_json["FCT"].iteritems() if k==["cvl"] ]

我似乎无法得到过去的类型错误:例如索引必须是int而不是字符串,或者我只是过滤掉所有内容并得到一个空数组。

发生了什么事?

(提前谢谢)

2 个答案:

答案 0 :(得分:2)

hrl = { 
    "hourly": [
        {
            "FCT": {"time":"", "cvl": "6am"},
            "wind": "brzy",
            "tmp": {"brm":"hot", "cel":"37"},
            "FCT": {"time": "", "cvl":"7am"}
        }
        #.... list continues ..
    ]
}

print hrl["hourly"][0]["FCT"]["cvl"]
print hrl["hourly"][0]["tmp"]["cel"]

--output:--
7am
37

第二个想法,看起来你没有发表你的数据结构的非常好的表示。如果它看起来像这样更有意义:

hrl = { 
    "hourly": [
        {
            "FCT": {"time":"", "cvl": "6am"},
            "wind": "brzy",
            "tmp": {"brm":"hot", "cel":"37"},
        },

        {
            "FCT": {"time":"", "cvl": "7am"},
            "wind": "windy",
            "tmp": {"brm":"cool", "cel":"20"},
        }
    ]
}

print hrl["hourly"][0]["FCT"]["cvl"]
print hrl["hourly"][0]["tmp"]["cel"]

print hrl["hourly"][1]["FCT"]["cvl"]
print hrl["hourly"][1]["tmp"]["cel"]

--output:--
6am
37
7am
20

results = [
    (_dict["FCT"]["cvl"], _dict["tmp"]["cel"])
    for _dict in hrl["hourly"]
]

print results

--output:--
[('6am', '37'), ('7am', '20')]

hrl [“hourly”]是一个字典数组。在python中,您可以通过使用for-in循环来迭代数组而不使用索引:

for color in ["red", "green", "blue"]:
    print color

--output:--
red
green 
blue

所以你只需要获取数组,hrl [“hourly”],并使用for-in循环来选择数组中的每个字典 - 不需要整数索引。

一个提示:您感兴趣的数据结构的唯一部分是数组,因此您甚至不应该说您的数据结构是一个字典。只需写下:

arr = hrl["hourly"]

现在你正在处理一个数组,所以你不必担心一些嵌套。更进一步,你可以写:

outer_dict = arr[0]
inner_dict_hour = outer_dict["FCT"]
inner_dict_tmp = outer_dict["tmp"]

现在你有两个非嵌套词典。例如,获得温度很容易:

 tmp = inner_dict_tmp["cel"]

从那里,您可以替换inner_dict_tmp等于:

 tmp = inner_dict_tmp      ["cel"]
             |
             v
 tmp = outer_dict["tmp"]   ["cel"]

代替outer_dict:

 tmp = outer_dict  ["tmp"]["cel"]
           |
           v
 tmp =   arr[0]    ["tmp"]["cel"]

然后代替arr:

 tmp =     arr         [0]["tmp"]["cel"]
            |
            v
 tmp = hrl["hourly']   [0]["tmp"]["cel"]

答案 1 :(得分:0)

您可以尝试

CVL = [ v for k,v in parsed_json['hourly'][0]["FCT"].iteritems() if k==["cvl"] ]

代替。