如何遍历JSON嵌套字典的Location值并统计特定地点条目数
问题:统计特定地点的职位条目数量时循环异常
问题描述
尝试遍历JSON数据中的职位字典,统计指定地点的条目数量,但循环无法正常工作:要么会统计所有条目(无论地点是否匹配),要么抛出TypeError: list indices must be integers or slices, not str错误。原代码如下:
import requests def count_jobs_by_location(location): api_url = "https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBM-DA0321EN-SkillsNetwork/labs/module%201/Accessing%20Data%20Using%20APIs/jobs.json" response = requests.get(api_url) if response.ok: data = response.json() count = 0 for job in data["jobs"]: if job["Location"].lower() == location.lower(): count += 1 return count else: return None
错误原因分析
- TypeError报错原因:该API返回的JSON数据直接是职位列表,而非包含
jobs键的字典。原代码中尝试用data["jobs"]索引列表,自然会触发类型错误。 - 统计所有条目的原因:如果曾错误直接遍历
data但未正确判断地点(比如Location字段格式不匹配、条件判断逻辑错误),或者部分条目的Location为空/非字符串类型,调用lower()时抛出异常却未被捕获,可能导致代码逻辑意外执行(比如错误吞掉异常后继续计数)。
修复方案
- 直接遍历API返回的列表(无需
data["jobs"]); - 增加异常处理,避免因缺少Location键、Location非字符串类型导致的报错;
- 改用模糊匹配(
in)替代精确匹配,适配Location字段带后缀的情况(比如"New York, NY")。
修复后的代码
import requests def count_jobs_by_location(location): api_url = "https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBM-DA0321EN-SkillsNetwork/labs/module%201/Accessing%20Data%20Using%20APIs/jobs.json" response = requests.get(api_url) if response.ok: data = response.json() count = 0 target_loc = location.lower() for job in data: # 处理可能的KeyError和非字符串类型的Location loc = job.get("Location") if isinstance(loc, str) and target_loc in loc.lower(): count += 1 return count else: return None
内容的提问来源于stack exchange,提问作者Chris Chatz
相关产品推荐
相关产品推荐

