Поиск ключа внутри ключей кортежа словаря в Python

#python #python-3.x

#python #python-3.x

Вопрос:

При попытке запустить следующий код:

 temp3 = {
    ('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD','EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP'):'EURIBOR_EUR_1Y'
}

print (temp3.get('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD'))
  

Вывод:

 None
  

Ожидаемый:

 EURIBOR_EUR_1Y
  

Комментарии:

1. EURIBOR_EUR_1Y — это не ключ, а значение для первого кортежа, который действует как ваш словарь, прочитайте это следующим образом: (‘EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD’,’EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP’): ‘EURIBOR_EUR_1Y’

2. Что это? ключ кортежа со значением str?

3. Я предположил, что в скобках он принимает значение «ИЛИ», а не «И».

Ответ №1:

Вы ожидаете, что get функция распакует key значения и выполнит поиск внутри кортежей; это так не работает.

Правильный способ — использовать тот, key который вы использовали для создания dict .

Пример:

 temp3 = {
    ('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD',
     'EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP'):'EURIBOR_EUR_1Y'
}

print(temp3.get(('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD',
     'EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP')))
  

Который выведет ключ; чтобы получить все значения, которые имеют соответствующий ключ, вы можете использовать следующее:

 def key_search(needle, haystack):
    matches = []

    for key, value in haystack.items():
        if type(key) in [list, tuple, dict] and needle in key:
            matches.append(value)
        elif needle == key:
            matches.append(value)

    return matches

data = {
    (1, 2, 3): 'heyyy',
    (2, 1): 'heyyy there'
}

print(key_search(1, data))
  

Вывод

 ['heyyy there', 'heyyy']
  

Где needle — это ключ, который вы ищете, а стог сена — это ваши данные.

Комментарии:

1. Я предположил, что в скобках он принимает значение «ИЛИ», а не «И». Что я хотел сделать, так это то, что если указан любой из ключей в скобке, он возвращает одно значение, как указано.

2. Я обновил вопрос решением. Вы можете либо использовать это, либо использовать yield который является генератором.

3. Если вам нужно только одно совпадение, вы можете удалить matches = [] и заменить matches.append(value) на return value

4. Я также думал в том же направлении, но поскольку я должен передать этот код кому-то другому. Я думаю, проще всего было бы разделить каждую пару. Большое вам спасибо, очень ценю это.

Ответ №2:

На самом деле правильный ключ ('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD','EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP')

Итак, если вы попытаетесь:

 print(temp3.get(('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD','EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP')))
  

Вы получите:

 EURIBOR_EUR_1Y
  

Комментарии:

1. Я предположил, что в скобках он принимает значение «ИЛИ», а не «И». Что я хотел сделать, так это то, что если указан любой из ключей в скобке, он возвращает одно значение, как указано.

Ответ №3:

Вы не используете полный ключ для словаря.

Попробуйте использовать полный ключ

 (temp3.get('EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD','EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP'))
'EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-GBP'
  

Комментарии:

1. Я предположил, что в скобках он принимает значение «ИЛИ», а не «И». Что я хотел сделать, так это то, что если указан любой из ключей в скобке, он возвращает одно значение, как указано.

Ответ №4:

Это то, что вы ищете

 print(temp3.get([i for i in temp3 if 'EUR-EURIBOR-1Y-SWAPTION-PHYSICAL-ANNUAL-BOND-QUANTO-USD' in i][0]))
  

Вывод:

 EURIBOR_EUR_1Y