需要说明的是,我正在使用CoinMarketCaps API练习Python技能。
下面的代码很好用:
import json
# 1 JSON string in list, works
info_1_response = ['{"status": {"timestamp": "2023-01-25T22:59:58.760Z", "error_code": 0, "error_message": null, "elapsed": 16, "credit_count": 1, "notice": null}, "data": {"BTC": {"id": 1, "name": "Bitcoin", "symbol": "BTC"}}}']
for response in info_1_response:
info_1_dict = json.loads(response)
#print(info_1_dict) #works
data = info_1_dict['data']['BTC']
print(f"only id = {data['id']}")
- 输出**:仅id = 1
然而,如果我在一个列表中有2个响应,我将如何获得每个符号的ID(BTC/ETH)?代码:
info_2_response = ['{"status": {"timestamp": "2023-01-25T22:59:58.760Z", "error_code": 0, "error_message": null, "elapsed": 16, "credit_count": 1, "notice": null}, "data": {"BTC": {"id": 1, "name": "Bitcoin", "symbol": "BTC"}}}', '{"status": {"timestamp": "2023-01-25T22:59:59.087Z", "error_code": 0, "error_message": null, "elapsed": 16, "credit_count": 1, "notice": null}, "data": {"ETH": {"id": 1027, "name": "Ethereum", "symbol": "ETH"}}}']
for response in info_2_response:
info_2_dict = json.loads(response)
#print(info_2_dict) #works
print(info_2_dict['data']) #works
- 输出:**
{'BTC': {'id': 1, 'name': 'Bitcoin', 'symbol': 'BTC'}}
{'ETH': {'id': 1027, 'name': 'Ethereum', 'symbol': 'ETH'}}
但是如果我***只***想要ID呢?看起来我需要一个动态参数:data = info_2_dict['data']['DYNAMIC PARAMETER-(BTC/ETH)']
print(f"only id = {data['id']}")
- 所需输出:**1,1027
这可能吗?
2条答案
按热度按时间hfyxw5xn1#
只需迭代另一个级别:
我们可以使用
map(json.loads, ...)
从循环体中删除一些样板文件,而且既然你知道dict中只有一项,你就可以使用可迭代解包:如果您 * 期望 * 只有一个,您可能希望抛出一个错误,因此可以执行以下操作:
注意,在顶级版本中,
[(coin, data), *_] = response['data'].items()
在dict中有多个项时不会失败,其余项被赋给一个名为_
的列表,我们忽略了它,但这只是一个“一次性”变量的常规名称。但是,另一个版本将失败:
js81xvg62#
只要
data
字典只有一个键,就可以执行以下操作:这将打印:
代码的工作原理是使用字典的
.values()
方法获取一个值列表,因为只有一个值,所以我们只从列表中获取第一个值,然后查找id
属性。我们可以扩展复合语句,使运算更清楚一些: