0

我有一个看起来像这样的 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 而不是字符串,或者我只是过滤掉所有内容并得到一个空数组。

到底是怎么回事?

(提前致谢)

4

2 回答 2

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"]
于 2013-07-23T05:09:19.163 回答
0

你可以试试

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

反而。

于 2013-07-23T05:03:19.903 回答