在Python中循环使用嵌套字典

在Python中循环使用嵌套字典,python,pandas,dictionary,Python,Pandas,Dictionary,我想从这本字典中获取动态键,但循环时出错 d= { "name": "rex" "age": "23" "data": { "country" : { "name": "xx", "loc": "ee" , "loc1"

我想从这本字典中获取动态键,但循环时出错

d= {
    "name": "rex"
    "age": "23"
     "data": {
                "country" :   { "name": "xx", "loc": "ee" , "loc1": "pp" }
                 "country2" : { "name": "tx", "loc": "ef" , "loc2": "rp" }
                 "country2"  :{ "name": "yx", "loc": "ve" , "loc1": "hp" }
              }
   }

我正试图将这些信息解析成一个整洁的csv。但这并不是在字典中循环并突然停止。如何简洁地在字典中循环捕获所有嵌套值

name= d["name"]
  age= d["age"]
  for i in d["data"]:
      country_name= d[i]["name"]
      country_loc= d[i]["loc"]
      country_loc1 = d[i]["loc1"]
你可以用

name = d["name"]
age = d["age"]
for i in d["data"]:
    country_name = d["data"][i]["name"]
    #                ^^^
    country_loc = d["data"][i]["loc"]
    country_loc1 = d["data"][i]["loc1"]

    print(country_name)
或-被认为是“更具蟒蛇性”:


下面是一个有效的代码版本。我建议将其与原始代码进行比较,并尝试理解其中的差异:

d = {"name": "rex",
     "age": "23",
     "data": {
              "country": {"name": "xx", "loc": "ee", "loc1": "pp"},
              "country2": {"name": "tx", "loc": "ef", "loc1": "rp"},
              "country3": {"name": "yx", "loc": "ve", "loc1": "hp"}
             }
     }

name = d["name"]
age = d["age"]
for i in d["data"].keys():
    country_name = d["data"][i]["name"]
    country_loc = d["data"][i]["loc"]
    country_loc1 = d["data"][i]["loc1"]

如果你想获得CSV,一个简单的方法就是利用熊猫的力量。有多种方法,但有一种方法如下:

import pandas as pd

#create data
d= {
   "name": "rex"
   "age": "23"
   "data": {
       "country" :   { "name": "xx", "loc": "ee" , "loc1": "pp" }
       "country2" : { "name": "tx", "loc": "ef" , "loc2": "rp" }
       "country2" :{ "name": "yx", "loc": "ve" , "loc1": "hp" }
   }
   }

# we reset index so that concatenated objects share an index
df = pd.DataFrame(d).reset_index() 
# json_normalise expands our nested data. Concat unions along the rows. We drop the now unneeded data column
out = pd.concat([df,pd.json_normalize(df.data)],axis=1).drop('data',axis=1)
out.to_csv('out.csv')
看起来像:

      index name age name loc loc1
0   country  rex  23   xx  ee   pp
1  country2  rex  23   yx  ve   hp

i
本身就是一本字典。您的行应该类似于
country\u name=i[“name”]
。请注意,您的字典字符串\u-like格式不好,只要在键:值对的实例之间缺少
。例如,在
“rex”
“country”之后:{“name”:“xx”,“loc”:“ee”,“loc1”:“pp”}
您想要什么样的输出是有点不清楚的,但是如果您想要进入表格格式并输出到csv,那么pandas是非常适合的(参见答案)。使用
i[“name”]
而不是
d[“data”][i][“name”]
@zvi:Nah。完全使用第二种方法。这是前一个答案的一对一副本-仅三分钟后。
      index name age name loc loc1
0   country  rex  23   xx  ee   pp
1  country2  rex  23   yx  ve   hp