Python — функция lambda на примере поиска в списке из словарей

Admin Python

Функция lambda в Python для тех кому хочется краткости и не хочет расписывать функции. Считается, что лучше функцию вынести, но иногда удобнее использовать lambda.

Пример 1

На примере отрывка из класса ниже по запуску таймеров анализа данных.

class Timer:

    def __init__(self):
        self.default = [
            {'name': 'change_percent', 'title': 'Изменение процента'},
            {'name': 'change_price', 'title': 'Изменение цены'},
            {'name': 'analyse_sp500', 'title': 'Анализ SP&500'},
            {'name': 'brent_oil', 'title': 'Анализ нефти'},
        ]

    def save_user_timer(self, user_id, name, timer, percent):
         # Если имя не входит в параметры по умолчанию
        default = self.default
        if not list(filter(lambda setting: setting['name'] == name, default)):
            return ''

В инициализации класса есть переменная (self.default) с листом (list), в котором содержаться словари (dic).

В функции сохранения новых данных для таймера (save_user_timer), мы проверим входящие данные пользователя на наличие обязательно совпадения с ключами в поле name.

Иными словами, если с фронтенда в переменную name пришло значение отличное от любого из значения name переменной self.default, то мы прервем функцию ничего не передавая.

Мы знаем, что такое событие может случится в основном только в случае попыток взлома через sql инъекции и поэтому даже не предупреждаем, почему запрос не прошел, а только прерываем.

Пример 2

Получаем первый список со словарями:

query = db.session.query(Operation).filter_by(user_id=1)
operations = [x.serialize for x in query.all()]

В переменной operations будет список из словарей такого рода:

[{‘name’: ‘Genuine Parts’,
‘operation_type’: ‘Sell’,
‘payment’: 367.92,
‘price’: 91.98,
‘quantity’: 4,
‘user_id’: 1},…]

Далее получаем второй список со словарями:

markets = [r._asdict() for r in db.session.query(MarketShort.name, MarketShort.last_price).all()]

В нем находятся такие данные:

[{‘name’: ‘Netflix’, ‘last_price’: 526.59}, {‘name’: ‘Spirit Airlines Inc’, ‘last_price’: 18.75},…]

Находим совпадение имени в списке словарей «operations» в списке словарей «markets»:

for operation in operations:
    matched = list(filter(lambda market: market['name'] == operation['name'], markets))

# При совпадении сохраняем имя:

    if matched:
        operation['last_price'] = matched[0]['last_price']</div>

В конечном счете мы получим переделанный список со словарями, в которых будут добавлены новые данные:

[{‘name’: ‘Moderna Inc’,
‘operation_type’: ‘Buy’,
‘payment’: -687.0,
‘price’: 68.7,
‘last_price’: 67.83,
‘quantity’: 10,
‘user_id’: 1},…]

Обратите внимание, что добавилось ‘last_price’: 67.83.

Весь код с функцией:

def get_all_operations():
    # Получаем список операций
    query = db.session.query(Operation).filter_by(user_id=flask_login.current_user.id)
    operations = [x.serialize for x in query.all()]

    # Получаем список маркетов
    markets = [r._asdict() for r in db.session.query(MarketShort.name, MarketShort.last_price).all()]

    # Находим совпадение имени в списке словарей "operations" в списке словарей "markets"
    for operation in operations:
        matched = list(filter(lambda market: market['name'] == operation['name'], markets))

        # При совпадении сохраняем имя
        if matched:
            operation['last_price'] = matched[0]['last_price']

    return json.dumps(operations)

Кстати, на сайте нет рекламы. У сайта нет цели самоокупаться, но если вам пригодилась информация можете задонатить мне на чашечку кофе в макдаке. Лайкнуть страницу или просто поблагодарить. Карма вам зачтется.

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Python — функция lambda на примере поиска в списке из словарей"