Получение ключа Nested Dic с использованием критерия нескольких значений - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть следующий вложенный словарь:

go._Order_Data_DB.items()

Out[62]: dict_items([(84852344, {'_action': 'OPEN', '_type': 0, '_symbol': 'EURUSD', '_price': 0.0, '_SL': 50, '_TP': 50, '_comment': 'DWX_Python_to_MT', '_lots': 0.01, '_magic': 123456, '_ticket': 0}), (84852345, {'_action': 'CLOSE', '_type': 0, '_symbol': 'EURUSD', '_price': 0.0, '_SL': 50, '_TP': 50, '_comment': 'DWX_Python_to_MT', '_lots': 0.01, '_magic': 123456, '_ticket': 84852345}), 
(84852374, {'_action': 'OPEN', '_type': 0, '_symbol': 'GBPUSD', '_price': 0.0, '_SL': 50, '_TP': 50, '_comment': 'DWX_Python_to_MT', '_lots': 0.01, '_magic': 123456, '_ticket': 84852345})])

Я хотел бы получить номера заказов (ключ), если выполнены два условия: '_action' == 'OPEN' и '_symbol' == ccy.Я попытался использовать функцию ниже, но она смотрит только на первый критерий, было бы замечательно, если бы кто-то знал, как заставить оба критерия работать, поскольку он, кажется, игнорирует 'и'.

def get_order_num(ccy): 
    for k, v in go._Order_Data_DB.items():
        for k1, v1 in v.items():
            if v1 == ccy and v1 == 'OPEN':
                return(k)

1 Ответ

0 голосов
/ 29 декабря 2018

Существует две основные проблемы:

  1. Вам не нужен вложенный цикл для проверки определенных ключей в ваших под-словарях.Ваш оператор if может запрашивать ключи из значений вашего внешнего словаря.
  2. Если несколько под-словарей удовлетворяют вашим критериям, return захватит только первый из них.Для извлечения всех предметов, удовлетворяющих вашим условиям, вместо этого получается yield, а затем исчерпывается ваш генератор через list.

Вот демонстрация;

d = dict([(84852344, {'_action': 'OPEN', '_type': 0, '_symbol': 'EURUSD', '_price': 0.0, '_SL': 50, '_TP': 50, '_comment': 'DWX_Python_to_MT', '_lots': 0.01, '_magic': 123456, '_ticket': 0}),
          (84852345, {'_action': 'CLOSE', '_type': 0, '_symbol': 'EURUSD', '_price': 0.0, '_SL': 50, '_TP': 50, '_comment': 'DWX_Python_to_MT', '_lots': 0.01, '_magic': 123456, '_ticket': 84852345}), 
          (84852374, {'_action': 'OPEN', '_type': 0, '_symbol': 'GBPUSD', '_price': 0.0, '_SL': 50, '_TP': 50, '_comment': 'DWX_Python_to_MT', '_lots': 0.01, '_magic': 123456, '_ticket': 84852345})])

def get_order_num(ccy): 
    for k, v in d.items():
        if v['_symbol'] == ccy and v['_action'] == 'OPEN':
            yield k

res1 = list(get_order_num('EURUSD'))  # [84852344]
res2 = list(get_order_num('GBPUSD'))  # [84852374]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...