Найти минимум в словаре списков после запроса Skyscanner?

Я новичок в Python, и я играю с Python API Skyscanner, чтобы практиковаться с Python и API. Ответ от API Skyscanner имеет структуру словаря, состоящего из нескольких списков, которые, в свою очередь, состоят из множества словарей.

Смотрите ниже:Skyscanner Query

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

Любая помощь приветствуется, если у вас есть какая-то конкретная структура данных, которую я могу использовать, это также приветствуется.

1 ответ

Решение

Как указывает @ephemient,

Вы можете пропустить шаг в предыдущей версии этого ответа и просто перейти прямо к...

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

Это просто возьмет цитату с минимальной ценой из последовательности напрямую. (Вы также можете использовать itemgetter('MinPrice') вместо лямбды, импортируя ее из operators библиотека, для немного более оптимизированной ключевой функции.)


Предыдущая версия:

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

При этом используется выражение генератора для генерации последовательности кортежей, причем первый элемент каждого кортежа является ценой, а второй элемент каждого кортежа является кавычкой, связанной с этой ценой.

Затем он выбирает наименьший кортеж из последовательности, который из-за того, как Python сортирует кортежи, является самым дешевым. Используя распаковку последовательности (описанную в ссылке 'tuples' выше), она разделяет это обратно на две переменные, min_price а также quote,

Внутренне, это все еще включает в себя циклическое прохождение всех цен, потому что это необходимое условие для их сравнения. Тем не менее, он избегает повторного копирования отдельных полей кавычек, потому что он просто сохраняет ссылку на каждую кавычку, связанную с ее ценой, как часть объектов кортежа.

Передайте тип и порядок сортировки в самой строке запроса. Всего одна линия, и вы сначала получите самую низкую цену. Установите pageSize, чтобы контролировать количество желаемых маршрутов.

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

Другие вопросы по тегам