Python 列表理解和 JSON 解析

Ant*_*y W 4 python json list-comprehension

我是 Python 新手,试图找出使用列表理解将 JSON 对象的值解析为数组的最佳方法。

这是我的代码 - 我正在查询公开可用的 iNaturalist API,并希望获取它返回的 JSON 对象,以便我将 JSON 对象的特定部分放入凹凸数组中:

import json
import urllib2

#Set Observations URL request for Resplendent Quetzal of Costa Rica
query = urllib2.urlopen("http://api.inaturalist.org/v1/observations?place_id=6924&taxon_id=20856&per_page=200&order=desc&order_by=created_at")
obSet = json.load(query)

#Print out Lat Long of observation
n = obSet['total_results']

for i in range(n) :
    print obSet['results'][i]['location'] 
Run Code Online (Sandbox Code Playgroud)

这一切都工作正常并给出以下输出:

9.5142456535,-83.8011438905
10.2335478381,-84.8517773638
10.3358965682,-84.9964271008
10.3744851815,-84.9871494128
10.2468720343,-84.9298072822
...
Run Code Online (Sandbox Code Playgroud)

接下来我想做的是将 for 循环替换为列表理解,并将位置值存储在元组中。我正在努力解决语法问题,因为我猜它是这样的:

[(long,lat) for i in range(n) for (long,lat) in obSet['results'][i]['location']]
Run Code Online (Sandbox Code Playgroud)

但这不起作用...感谢您的帮助。

Ant*_*ala 6

obSet['results']是一个列表,不需要使用range它来迭代它:

for item in obSet['results']:
    print(item['location'])
Run Code Online (Sandbox Code Playgroud)

要使其成为列表理解,您可以编写:

[item['location'] for item in obSet['results']]
Run Code Online (Sandbox Code Playgroud)

但是,每个位置都被编码为字符串,而不是浮点列表或元组。要将其转换为正确的格式,请使用

[tuple(float(coord) for coord in item['location'].split(','))
 for item in obSet['results']]
Run Code Online (Sandbox Code Playgroud)

也就是说,使用分隔符将item['location']字符串拆分为多个部分,然后将每个部分转换为浮点型,并创建这些浮点坐标的元组。,