0

我是 Python 新手,正在尝试按项目过滤字典。重现步骤:

import requests

# Get a list of planets and convert from Json.
space = requests.get("https://api.le-systeme-solaire.net/rest/bodies/")
arr = space.json()

# Select only planets.
{k:v for (k,v) in arr.items() if isPlanet == True}

错误:

NameError: global name 'isPlanet' is not defined

我知道isPlanet是正确的,我已经用另一种语言进行了验证。我在这里做错了什么?

4

2 回答 2

1

你得到的 JSON 响应是一个只有一个 key:value 的字典。keybodies和 value 是一个字典列表。

import requests
from pprint import pprint

# Get request with JSON response.
response = requests.get("https://api.le-systeme-solaire.net/rest/bodies/")
data = response.json()

# Make a list with the planets.
planets = [item for item in data['bodies'] if item.get("isPlanet")]
pprint(planets)

输出

[{'alternativeName': 'A899 OF - 1943 XB',
  'aphelion': 445410000,
  'aroundPlanet': None,
  'axialTilt': 3,
  'density': 2.161,
  'dimension': '',
  'discoveredBy': 'Giuseppe Piazzi',
  'discoveryDate': '01/01/1801',
  'eccentricity': 0.07582,
  'englishName': '1 Ceres',
  'equaRadius': 487.0,
  'escape': 510.0,
  'flattening': 0.9619,
  'gravity': 0.28,
  'id': 'ceres',
  'inclination': 10.593,
  'isPlanet': True,
  'mass': {'massExponent': 20, 'massValue': 9.393},
  'meanRadius': 476.2,
  'moons': None,
  'name': '(1) Cérès',
  'perihelion': 382620000,
  'polarRadius': 455.0,
  'rel': 'https://api.le-systeme-solaire.net/rest/bodies/ceres',
  'semimajorAxis': 413690250,
  'sideralOrbit': 1681.63,
  'sideralRotation': 9.07,
  'vol': {'volExponent': 9, 'volValue': 4.21}},
 {'alternativeName': '2003 UB313',
  'aphelion': 14594512904,
  'aroundPlanet': None,
  'axialTilt': 0,
  'density': 2.52,
  'dimension': '',
  'discoveredBy': 'Michael E. Brown, Chadwick Trujillo, David L. Rabinowitz',
  'discoveryDate': '05/01/2005',
  'eccentricity': 0.44068,
  'englishName': '136199 Eris',
  'equaRadius': 0.0,
  'escape': 1380.0,
  'flattening': 0.0,
  'gravity': 0.82,
  'id': 'eris',
  'inclination': 44.0445,
  'isPlanet': True,
  'mass': {'massExponent': 22, 'massValue': 1.66},
  'meanRadius': 1163.0,
  'moons': [{'moon': 'Dysnomie',
             'rel': 'https://api.le-systeme-solaire.net/rest/bodies/dysnomie'}],
  'name': '(136199) Éris',
  'perihelion': 5765732799,
  'polarRadius': 0.0,
  'rel': 'https://api.le-systeme-solaire.net/rest/bodies/eris',
  'semimajorAxis': 10180122852,
  'sideralOrbit': 203830.0,
  'sideralRotation': 25.92,
  'vol': {'volExponent': 9, 'volValue': 6.59}},

... rest of list elements skipped for brevity ...
]

此外 - API 为您提供了根据特定标准过滤您获得的数据的选项(即您可以过滤您在响应中获得的数据),但是您是一个错误filter[]=isPlanet,eq,true(请参阅https://github.com/systeme- solaire/api-rest/issues/3)。

import requests

# Get a list of planets and convert from Json.
params = {'filter[]':'isPlanet,neq,false'}

response = requests.get("https://api.le-systeme-solaire.net/rest/bodies", params=params)
data = response.json()
planets = data.get('bodies')
# print just len of planets list
print(len(planets))
于 2020-11-14T10:56:29.807 回答
0

也许你正在寻找这样的东西。

[v for v in arr['bodies'] if (v['isPlanet'] == True)]

arr['bodies']将为您返回所有机构的列表

v['isPlanet']允许您访问字典中的该键

没有意义arr.items(),因为arr只有一个键 ( bodies)

{}替换为[],所以我们得到一个列表而不是字典作为输出

于 2020-11-14T10:54:35.127 回答