0

我是 Python 新手,我正在使用 Skyscanner 的 Python API 来练习 Python 和 API。来自 Skyscanner 的 API 的响应具有由多个列表组成的字典结构,这些列表又由许多字典组成。

见下文: Skyscanner 查询

result_base= flights_cache_service.get_cheapest_quotes(
market='AU',
currency='AUD',
locale='en-GB',
originplace='NYC',
destinationplace='MIA',
outbounddate='2017-07').parsed

result_base变量是一个字典:

[in]
result_base.keys()
[out]
[u'Quotes', u'Currencies', u'Places', u'Carriers']

例如,如果我这样做:

[in]
print type(results_base['Quotes'])
[out]
list

列表中的每个项目都是一个具有多个值的行程,例如:

[in]
result_base['Quotes'][0]
[out]
{u'Direct': False,
 u'MinPrice': 437.0,
 u'OutboundLeg': {u'CarrierIds': [843],
 u'DepartureDate': u'2017-07-01T00:00:00',
 u'DestinationId': 56628,
 u'OriginId': 67852},
 u'QuoteDateTime': u'2017-02-02T13:20:59',
 u'QuoteId': 1}

我试图找到最有效的方法来从results_base['Quotes']. 我尝试遍历列表中的每个项目,但我正在寻找是否有更有效的方法来做到这一点。

我的代码:

base_result={}
min_price=99999
for i in result_base['Quotes']:
    if i['MinPrice']<min_price:
        min_price=i['MinPrice']
        base_result['Direct']=i['Direct']
        base_result['MinPrice']=i['MinPrice']
        base_result['OutboundLeg']=i['OutboundLeg']
        base_result['QuoteDateTime']=i['QuoteDateTime'] 

任何帮助表示赞赏,如果您有任何我可以使用的特定数据结构,也欢迎。

4

2 回答 2

2

正如@ephemient 指出的那样,

您可以跳过此答案的先前版本中的一个步骤,然后直接跳到...

lowest_quote = min(result_base['Quotes'], key=lambda q: q['MinPrice'])

这将直接从序列中获取最低价格的报价。(您也可以itemgetter('MinPrice')通过从库中导入来代替 lambda operators,以获得稍微优化的键功能。)


以前的版本:

quotes_and_prices = ((q['MinPrice'], q) for q in result_base['Quotes'])
min_price, quote = min(quotes_and_prices)

这使用生成器表达式来生成元组序列,每个元组的第一个元素是价格,每个元组的第二个元素是与该价格关联的报价。

然后它从序列中抓取最小的元组,由于 Python 对元组的排序方式,它是价格最低的元组。使用序列解包(在上面的“元组”链接中描述)它将其分离回两个变量,min_price并且quote.

在内部,这仍然涉及遍历所有价格,因为这是比较它们的必要条件。但是,它避免了重复复制报价的各个字段,因为它只是保留对与其价格关联的每个报价的引用作为元组对象的一部分。

于 2017-02-03T03:28:46.293 回答
0

在查询字符串本身中传递排序类型和顺序。只需一条线,您将首先获得最低价格。设置 pageSize 以控制您想要的行程数。

querystring = {"sortType":"price","sortOrder":"asc","pageIndex":"0","pageSize":"10"}

于 2019-12-07T07:52:09.740 回答