json 在运行我的代码时,我一直收到一个错误,即“列表索引必须是整数或切片,而不是str”

f87krz0w  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在做一个作业,我写了一个程序,从URL中检索数据:http://derekowens.com/cs/satellites.aspx?p={planet}在哪里代替{planet},我可以把我们太阳系中的一个行星,如地球,木星等。这个URL然后给我关于输入行星卫星的数据。我的程序检索这些数据,将JSON字符串中的数据加载到Python变量中,然后检查orbit_radius数据以确定哪个卫星离行星最近。代码如下:

import urllib.request
import json

planets = ["Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"]
for planet in planets:
    url = f"http://derekowens.com/cs/satellites.aspx?p={planet}"
    response = urllib.request.urlopen(url)
    data = json.loads(response.read())
    print(data)
    moons = data["satellites"]

    
    closest_moon = min(moons, key=lambda x: x["orbit_radius"])["moon"]
    print(f"{planet}, {closest_moon}, {min(moons, key=lambda x: x['orbit_radius'])['orbit_radius']}")

但是,在执行代码之后,我一直收到错误:

moons = data["satellites"]
TypeError: list indices must be integers or slices, not str

我如何修复这个问题,使我的代码正确运行并显示六行输出,六个行星中的每一个都有一行信息,格式如下:
行星名称月球名称轨道半径
感谢您的评分

ddarikpa

ddarikpa1#

查看服务器的响应,您得到的是一个列表而不是字典。
正确的代码可能如下所示:

import json
import urllib.request

planets = ["Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto"]
for planet in planets:
    url = f"http://derekowens.com/cs/satellites.aspx?p={planet}"
    response = urllib.request.urlopen(url)
    data = json.loads(response.read())

    closest_moon = min(data, key=lambda x: x["orbit_radius"])
    print(f"{planet}, {closest_moon['name']}, {closest_moon['orbit_radius']}")

图纸:

Mars, Phobos, 9380
Jupiter, Metis, 128000
Saturn, S/2009 S 1, 117000
Uranus, Cordelia, 49800
Neptune, Naiad, 48224
Pluto, Charon, 19591

相关问题