在Skyscanner请求后找到列表字典中的最小值?

时间:2017-02-03 03:26:28

标签: python skyscanner

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

如果您有任何我可以使用的特定数据结构,我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分: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)

这使用generator expression生成tuples序列,每个元组的第一个元素是价格,每个元组的第二个元素是与该价格相关的报价。

然后它从序列中抓取最小的元组,由于Python对元组的排序,它是价格最低的元组。使用序列解包(在上面的&#39;元组&#39;链接中描述),它将它分成两个变量,min_pricequote

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

答案 1 :(得分:0)

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

querystring = {“ sortType”:“价格”,“ sortOrder”:“ asc”,“ pageIndex”:“ 0”,“ pageSize”:“ 10”}