如何用Python删除JSON文件中大部分键?解决列表索引类型报错
问题分析与解决
错误原因
你遇到的list indices must be integers or slices, not str错误,核心问题是**tweet_list是列表类型**,你却把它当成字典用字符串索引["tweet"]访问,这不符合列表的索引规则(列表只能用整数或切片做索引)。另外直接遍历字典键并删除,还可能触发遍历过程中字典结构变化的运行时错误。
修正后的代码
推荐用创建新字典保留目标键的方式,更简洁安全:
import json def read_json(json_file: str) -> list: tweets_data = [] for tweet in open(json_file, 'r'): tweets_data.append(json.loads(tweet)) return tweets_data tags = ["created_at", "full_text"] tweet_list = read_json('test.json') # 遍历每条tweet,只保留指定键的新字典 filtered_tweets = [ {key: tweet[key] for key in tags if key in tweet} for tweet in tweet_list ] print(filtered_tweets[0])
如果一定要用删除键的方式,需要先遍历字典键的副本(避免遍历原字典时修改结构),同时注意遍历列表中的每个tweet元素:
import json def read_json(json_file: str) -> list: tweets_data = [] for tweet in open(json_file, 'r'): tweets_data.append(json.loads(tweet)) return tweets_data tags = ["created_at", "full_text"] tweet_list = read_json('test.json') # 遍历列表中的每条tweet for tweet in tweet_list: # 遍历字典键的副本(用list()转换),避免遍历中修改字典 for key in list(tweet.keys()): if key not in tags: del tweet[key] print(tweet_list[0])
关键说明
read_json返回的是包含多个tweet字典的列表,必须通过整数索引(比如tweet_list[0])访问单条tweet,再操作其键值对。- 字典推导式的方式更高效,还能自动处理tweet中缺少目标键的情况(不会抛出KeyError)。
内容的提问来源于stack exchange,提问作者Charlie Sugarman
相关产品推荐
相关产品推荐

