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

Find minimum in dictionary of lists after Skyscanner request?

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

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

正如@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 to generate a sequence of tuples,每个元组的第一个元素是价格,每个元组的第二个元素是与该价格关联的报价。

然后它从序列中抓取最小的元组,由于 Python 对元组的排序方式,它是价格最低的元组。使用序列解包(在上面的 'tuples' link 中描述)它将它分成两个变量,min_pricequote.

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

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

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