【发布时间】:2018-04-12 17:35:41
【问题描述】:
我从网站下载了一个 json 数据,我想从嵌套的 json 中选择特定的键:值。我将 json 转换为 python 字典。然后我使用字典理解来选择嵌套的 key:values ,但是嵌套太多了,我相信有比单独扩展每个字典更好的方法。我在我的方法中看到了冗余。你能推荐一个更好的方法吗?
{
"success": true,
"payload": {
"tag": {
"slug": "python",
"name": "Python",
"postCount": 10590,
"virtuals": {
"isFollowing": false
}
},
"metadata": {
"followerCount": 18053,
"postCount": 10590,
"coverImage": {
"id": "1*O3-jbieSsxcQFkrTLp-1zw.gif",
"originalWidth": 550,
"originalHeight": 300
}
}
}
}
我的方法:
从日期时间导入日期时间,时间增量
import json,re
data=r'data.json'
#reads json and converts to dictionary
def js_r(data):
with open(data, encoding='Latin-1') as f_in:
return json.load(f_in)
def find_key(obj, key):
if isinstance(obj, dict):
yield from iter_dict(obj, key, [])
elif isinstance(obj, list):
yield from iter_list(obj, key, [])
def iter_dict(d, key, indices):
for k, v in d.items():
if k == key:
yield indices + [k], v
if isinstance(v, dict):
yield from iter_dict(v, key, indices + [k])
elif isinstance(v, list):
yield from iter_list(v, key, indices + [k])
def iter_list(seq, key, indices):
for k, v in enumerate(seq):
if isinstance(v, dict):
yield from iter_dict(v, key, indices + [k])
elif isinstance(v, list):
yield from iter_list(v, key, indices + [k])
if __name__=="__main__":
my_dict=js_r(data)
print ( "This is dictionary for python tag",my_dict)
keys=my_dict.keys()
print ("This is the dictionary keys",my_dict.keys())
my_payload=list(find_key(my_dict,'title'))
print ("These are my payload",my_payload)
my_post=iter_dict(my_dict,'User','id')
print(list(my_post))
【问题讨论】:
-
你可以在这里找到我感兴趣的代码:stackoverflow.com/q/41777880/4014959
-
@PM 2Ring 如果我给函数我知道的嵌套键,它会给我嵌套在其中的字典吗?如果这是一个微不足道的问题,我深表歉意。
-
@wwii 也许吧。老实说,我并不完全清楚 Kaleab 在做什么。他真的要创建
payload_dict和paging_dict以供将来使用吗?还是他创建它们只是因为他认为他必须这样做才能获得他想要的数据? -
我建议使用我链接的代码,看看它是否符合您的要求。也看看stackoverflow.com/questions/46700975/…
-
@PM 2Ring 实际上,我的目的是深入巢穴,payload_dict 和 paging_dict 不是最终结果,我想进一步降低用户密钥,这就是为什么我认为它是多余的方式。
标签: python json dictionary key