Подтвердить что ты не робот

Одиночная строка кода для проверки ключа в двумерном вложенном внутреннем словаре

Есть ли один метод линии, чтобы проверить, имеет ли Python 2d dict внутренний ключ/значение?

Сейчас я делаю что-то вроде этого:

if d.has_key(k1):
    if d[k1].has_key(k2): 
        # do something

Есть ли лучший способ сделать это?

Спасибо

4b9b3361

Ответ 1

if k2 in d.get(k1, {}):
    # do something

Вышеприведенный фрагмент хорош, если вам все равно, существует ли k1 на самом деле или нет, и просто хотите знать, существует ли k2 внутри него, если он существует. Как вы можете видеть из моего фрагмента кода, я предпочитаю оператор in, но вы можете так же легко сказать

if d.get(k1, {}).has_key(k2):
    # do something

если вы предпочитаете эту идиому, но метод has_key устарел в Python 3.x, поэтому вам, вероятно, следует избегать его.

Ответ 2

Вы можете использовать in:

if k1 in d and k2 in d[k1]:

Метод has_key устарел и удален в Python 3.x.

по теме:

Ответ 3

У меня недостаточно репутации для комментариев, но обратите внимание, что верхнее предложение не будет выполнено, если значение key1 равно None.

if k2 in d.get(k1, {}):
    # do something

не работает, если d = {'k1': None} поэтому не забудьте указать значение ваших ключей.

Ответ 4

if d.has_key(k1) and d[k1].has_key(k2): 

Ответ 5

Ответ на ваш первый вопрос: да. Я считаю, что ответ Эли

if k2 in d.get(k1, {}):

лучший один лайнер, так как он избегает поиска k1 в d дважды. Ответ на ваш второй вопрос зависит от того, что вы хотите сделать, если сбой теста, и если вы хотите сделать что-то другое в двух случаях отказа. Если да:

try:
    d1 = d[k1]
    if k2 in d1:
        <both tests passed>
    else:
        <second test failed>
except KeyError:
    <first test failed>

Ответ 6

Не используйте has_key() использовать get(), поскольку has_key() устарел в python 3.x:

d.get(k1,None) and d[k1].get(k2,None):