我试图遍历嵌套的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():
但我不能让他们中的任何一个为我想做的事而工作。
任何帮助,或只是向正确的方向推进都将非常感激。
答案 0 :(得分:4)
永远不要在迭代它时删除列表中的项目,你可以
制作列表的副本以进行迭代:
for item in tweetlist[:]:
...
将您想要的结果保存在另一个列表中:
keep = []
for item in tweetlist:
if item in keepers_list:
keep.append(item)
答案 1 :(得分:3)
我在Python中的一般经验法则是,如果我发现自己使用循环,则搜索不同的方法。在这种情况下,要使用字典理解,基于原始条目:
keep = {key:tweet_list[key] for key in tweet_list.keys() if key in keepers_list}
除非原始数据集太大而必须在适当的位置进行处理,否则理解通常很快,如果相对较短,则自我记录足以易于理解。
答案 2 :(得分:2)
如果您想过滤掉字典,可以执行以下操作:
for k in dict.keys():
if k not in keepers_list:
del(dict[k])
print dict