如何根据特定参数将多个键:值dicts分配到已建立的字典中

时间:2017-10-06 09:42:17

标签: python json python-3.x dictionary praw

注意:这使用了一个名为PRAW的独立库,这对于理解问题并不重要,并且在下面的示例中使用# !!!注释了模糊/相关代码,以表示只需要了解代码生成一个dicts列表,代码就是必需的。

*问题有几层深 - 将尽力解释:

我在data.json中有JSON数据,看起来像这样:

 {
   "USA":[
      {"shortlink":"https://short/74h13v"},
      {"responses":[]}
   ],
   "Vietnam":[
      {"shortlink":"https://short/74gyn4"},
      {"responses":[]}
   ],
   "Italy":[
      {"shortlink":"https://short/74h3i9"},
      {"responses":[]}
   ]
}  

在模块(scraper.py)中,我有其他数据,其格式为comment.id="39dn28"comment.body="this is a comment"

我正在尝试将多个comment.idcomment.body个实例插入到[]附加的responses中,以便它看起来像这样:

{"responses": [
        {"39dn28": "this is my response"},
        {"39k229": "I'm another response"},
        {"35sn64": "another comment"} 
 ]}  

对我来说特别棘手的是当我必须考虑每组评论与单个国家/地区的ID匹配时(或者,'短链接')。我已使用shortlinks = [data[link][0]["shortlink"][-6:] for link in data]提取短链接ID,结果为['74h3i9', '74gyn4', '74h13v'] 现在我需要将每组注释与其相应的短链接相匹配,并将这些注释输入到它们正确属于的位置。

以下是我迄今为止所做的尝试,以深入了解我所拥有的以及我想要实现的目标:

with open("data.json", "r") as f:
    data = json.load(f)

shortlinks = [data[link][0]["shortlink"][-6:] for link in data]

for sl_id in shortlinks:
    # !!! (the following code produces a list of comment dicts.)
    submission = reddit.submission(id=sl_id)
    submission.comments.replace_more(limit=0)
    cmt_data = [{comment.id: comment.body} for comment in submission.comments.list()]

    for i in data:
        if sl_id in data[i][0]["shortlink"]:
            data[i][0]["responses"] = cmt_data

print(data)  

几乎有效..出于某种原因,我还返回了额外的空白'responses': []和其他短链接。

似乎无法弄明白。帮助很多,非常感谢。我愿意采用其他方法来完成它,以及存储数据的替代方法(可能不是一个dicts列表等等)。

2 个答案:

答案 0 :(得分:1)

如果你想得到这样的话:

{
   "USA":[
  {"shortlink":"https://short/74h13v"},
  {"responses":[{},{},{}]}],...]

} 

我认为,它应该是这样的:

for sl_id in shortlinks:
# !!! (the following code produces a list of comment dicts.)
submission = reddit.submission(id=sl_id)
submission.comments.replace_more(limit=0)
cmt_data = [{comment.id: comment.body} for comment in submission.comments.list()]

for i in data:
    if sl_id in data[i][0]["shortlink"]:
        data[i][1]["responses"] = cmt_data

答案 1 :(得分:0)

for key, value in data.items():
    for x in value:
        if sl_id in x['shortlink']:
            if not 'responses' in x:
                x['responses'] = []
            x['responses'] += cmt_data