Python列表理解与JSON解析

2024-10-02 12:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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']]

但这不管用…谢谢你的帮助。在


Tags: of对象inimportidjson列表for
3条回答

另一种无需列表理解就能获得[long,lat]列表的方法:

In [14]: map(lambda x: obSet['results'][x]['location'].split(','), range(obSet['total_results']))
Out[14]: 
[[u'9.5142456535', u'-83.8011438905'],
 [u'10.2335478381', u'-84.8517773638'],
 [u'10.3358965682', u'-84.9964271008'],
 [u'10.3744851815', u'-84.9871494128'],
...

如果您希望使用元组列表:

^{pr2}$

如果也要转换为浮动:

In [17]: map(lambda x: tuple(map(float, obSet['results'][x]['location'].split(','))), range(obSet['total_results']))
Out[17]: 
[(9.5142456535, -83.8011438905),
 (10.2335478381, -84.8517773638),
 (10.3358965682, -84.9964271008),
 (10.3744851815, -84.9871494128),
 (10.2468720343, -84.9298072822),
 (10.3456659939, -84.9451804822),
 ...

将代码直接转换为列表理解的方法是:

positions = [obSet['results'][i]['location'] for i in range(obSet['total_results'])]

obSet['total_results']是信息丰富的,但不是必需的,您可以直接循环使用obSet['results']并使用每个生成的字典:

^{pr2}$

现在您有了一个字符串的列表,因为每个'location'仍然是您之前打印的long,lat格式的字符串。在

拆分该字符串并将结果转换为一系列浮点数:

positions = [map(float, res['location'].split(',')) for res in obSet['results']]

现在,您有了一个包含浮点值的列表:

>>> [map(float, res['location'].split(',')) for res in obSet['results']]
[[9.5142456535, -83.8011438905], [10.2335478381, -84.8517773638], [10.3358965682, -84.9964271008], [10.3744851815, -84.9871494128], [10.2468720343, -84.9298072822], [10.3456659939, -84.9451804822], [10.3611732346, -84.9450302597], [10.3174360636, -84.8798676791], [10.325110706, -84.939710318], [9.4098152454, -83.9255607577], [9.4907141714, -83.9240819199], [9.562637289, -83.8170178428], [9.4373885911, -83.8312881263], [9.4766746409, -83.8120952573], [10.2651190176, -84.6360466565], [9.6572995298, -83.8322965118], [9.6997991784, -83.9076919066], [9.6811177044, -83.8487647156], [9.7416717045, -83.929327673], [9.4885099275, -83.9583968683], [10.1233252667, -84.5751029683], [9.4411815757, -83.824401543], [9.4202687169, -83.9550344212], [9.4620656621, -83.665183105], [9.5861809119, -83.8358881552], [9.4508914243, -83.9054016165], [9.4798058284, -83.9362558497], [9.5970449879, -83.8969131893], [9.5855562829, -83.8354434596], [10.2366179555, -84.854847472], [9.718459702, -83.8910277016], [9.4424384874, -83.8880459793], [9.5535916157, -83.9578166199], [10.4124554163, -84.9796942349], [10.0476688795, -84.298227929], [10.2129436252, -84.8384097435], [10.2052632717, -84.6053701877], [10.3835784147, -84.8677930134], [9.6079669672, -83.9084281155], [10.3583643315, -84.8069762134], [10.3975986735, -84.9196996767], [10.2060835381, -84.9698814407], [10.3322929317, -84.8805587129], [9.4756504472, -83.963818143], [10.3997876964, -84.9127311339], [10.1777433853, -84.0673088686], [10.3346128571, -84.9306278215], [9.5193346195, -83.9404786293], [9.421538224, -83.7689452093], [9.430427837, -83.9532672942], [10.3243212895, -84.9653175843], [10.021698503, -83.885674888]]

如果您必须使用元组而不是列表,请添加tuple()调用:

positions = [tuple(map(float, res['location'].split(',')))
             for res in obSet['results']]

后者还确保表达式在Python3中工作(其中map()返回迭代器,而不是列表);否则您必须使用嵌套列表理解:

# produce a list of lists in Python 3
positions = [[float(p) for p in res['location'].split(',')] for res in obSet['results']]

obSet['results']是一个列表,不需要使用range对其进行迭代:

for item in obSet['results']:
    print(item['location'])

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

^{pr2}$

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

[tuple(float(coord) for coord in item['location'].split(','))
 for item in obSet['results']]

也就是说,使用,作为分隔符,将item['location']字符串拆分为多个部分,然后将每个部分转换为一个float,并生成这些float坐标的元组。在

相关问题 更多 >

    热门问题