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 на примере поиска в списке из словарей"