在 python 中删除某些嵌套的 JSON 对象时遇到问题

Posted

技术标签:

【中文标题】在 python 中删除某些嵌套的 JSON 对象时遇到问题【英文标题】:Trouble deleting certain nested JSON objects in python 【发布时间】:2016-02-18 04:43:09 【问题描述】:

我正在尝试遍历嵌套 JSON 对象列表(通过 tweepy.api.search 从 twitter rest API 返回)并删除某些对象。我有一个要保留的对象列表。我希望指定保留哪些字典对象而不是删除哪些字典对象,因为不同的推文具有不同的键。它们都有一些键,例如“text”、“created_at”等……但还有一些只有某些推文才有的键。

我遇到了两个问题。

1) 遍历字典时无法删除字典项

2) 许多字典对象包含我无法访问的嵌套列表和字典

我正在遍历的 JSON 文件的一小部分:


"statuses": [
    
        "contributors": null,
        "coordinates": null,
        "created_at": "Thu Nov 12 01:28:07 +0000 2015",
        "entities": 
            "hashtags": [],
            "symbols": [],
            "urls": [
                
                    "display_url": "twitter.com/thehill/status\u2026",
                    "expanded_url": "https://twitter.com/thehill/status/664581138975989761",
                    "indices": [
                        139,
                        140
                    ],
                    "url": "https://t.co/9zfkg2FixZ"
                
            ],
            "user_mentions": [
                
                    "id": 2517854953,
                    "id_str": "2517854953",
                    "indices": [
                        3,
                        19
                    ],
                    "name": "It'sAlwaysPolitical",
                    "screen_name": "politicspodcast"
                
            ]
        ,
        "favorite_count": 0,
        "favorited": false,
        "geo": null

]

“状态”列表中的每一项都是一条推文,每次调用返回 100 条推文。

我想保留的物品清单:

keepers_list = [tweetlist["statuses"][i]["coordinates"],
                tweetlist["statuses"][i]["created_at"],
                tweetlist["statuses"][i]["entities"]["urls"]
                ]

我正在努力:

for item in tweetlist:
    if item not in keepers_list:
        del item

我已经尝试过这个确切的代码和更多的变体/不同的方法,但我无法回忆起它。我查看了许多关于此主题的堆栈交换帖子,但无法根据我的目的调整其中任何一个。

我尝试过使用

for key in dict.iterkeys(): ...
for value in dict.itervalues(): ...
for key, value in dict.iteritems():

但我不能让它们中的任何一个为我想做的事情工作。

我们将不胜感激任何帮助,或者只是朝着正确的方向前进。

【问题讨论】:

【参考方案1】:

在迭代列表时不要删除列表中的项目,您可以这样做

复制列表以进行迭代:

for item in tweetlist[:]:
    ...

将您想要的结果保存在另一个列表中:

keep = []
for item in tweetlist:
    if item in keepers_list:
        keep.append(item)

【讨论】:

【参考方案2】:

我在 Python 中的一般经验法则是,如果我发现自己使用循环,则寻找不同的方法。在这种情况下,要使用基于原始条目的字典理解:

keep = key:tweet_list[key] for key in tweet_list.keys() if key in keepers_list

除非原始数据集太大以至于必须就地处理,否则理解通常会很快,并且如果相对较短,则可以自我记录以易于理解。

【讨论】:

我认为key:tweet_list[k] 应该是key:tweet_list[key]【参考方案3】:

如果你想过滤掉一个字典,你可以这样做:

for k in dict.keys():
    if k not in keepers_list:
        del(dict[k])
print dict

【讨论】:

以上是关于在 python 中删除某些嵌套的 JSON 对象时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

使用python打印嵌套在数组中的json对象

Logstash 解析Json字符串,删除json嵌套字段

在 JSON 中编码嵌套的 python 对象

在python中更新添加到json(嵌套)。

如何验证和删除 JSON 对象的嵌套节点

如何使用Java更新JSON文件中的嵌套JSON对象?