我是Python新手,正在尝试使用列表理解来找出将JSON对象的值解析为数组的最佳方法。在
这是我的代码-我正在查询公共可用的iNaturalist API,并希望获取它返回的JSON对象,以便将JSON对象的特定部分放入一个bumpy数组中:
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']
这一切都很好,并给出以下输出:
^{pr2}$接下来我要做的是用列表理解替换for循环,并将位置值存储在元组中。我正在努力解决语法问题,我猜应该是这样的:
[(long,lat) for i in range(n) for (long,lat) in obSet['results'][i]['location']]
但这不管用…谢谢你的帮助。在
另一种无需列表理解就能获得[long,lat]列表的方法:
如果您希望使用元组列表:
^{pr2}$如果也要转换为浮动:
将代码直接转换为列表理解的方法是:
^{pr2}$obSet['total_results']
是信息丰富的,但不是必需的,您可以直接循环使用obSet['results']
并使用每个生成的字典:现在您有了一个字符串的列表,因为每个
'location'
仍然是您之前打印的long,lat
格式的字符串。在拆分该字符串并将结果转换为一系列浮点数:
现在,您有了一个包含浮点值的列表:
如果您必须使用元组而不是列表,请添加
tuple()
调用:后者还确保表达式在Python3中工作(其中
map()
返回迭代器,而不是列表);否则您必须使用嵌套列表理解:obSet['results']
是一个列表,不需要使用range
对其进行迭代:要使其成为列表理解,您可以写下:
^{pr2}$但是,每个位置都被编码为字符串,而不是浮点数的列表或元组。要使其成为正确的格式,请使用
也就是说,使用
,
作为分隔符,将item['location']
字符串拆分为多个部分,然后将每个部分转换为一个float,并生成这些float坐标的元组。在相关问题 更多 >
编程相关推荐