Python вложенный словарь поиска со значениями по умолчанию - PullRequest
5 голосов
/ 09 августа 2010
>>> d2
{'egg': 3, 'ham': {'grill': 4, 'fry': 6, 'bake': 5}, 'spam': 2}
>>> d2.get('spamx',99)
99
>>> d2.get('ham')['fry']
6

Я хочу получить значение fry внутри ветчины, если нет, получить значение, 99 или 88, как 2-й пример.Но как?

Ответы [ 4 ]

13 голосов
/ 09 августа 2010
d2.get('ham', {}).get('fry', 88)

Я бы, вероятно, разбил его на несколько утверждений в реальной жизни.

ham = d2.get('ham', {})
fry = ham.get('fry', 88)
3 голосов
/ 09 августа 2010

Если вам нужно сделать это много, вы можете написать вспомогательную функцию

def get_nested(d, list_of_keys, default):
    for k in list_of_keys:
        if k not in d: 
            return default
        d=d[k]
    return d

print get_nested(d2,['ham','spam'],99)
print get_nested(d2,['ham','grill'],99)
3 голосов
/ 09 августа 2010

Чтобы значения по умолчанию get работали правильно, первым значением по умолчанию должен быть словарь, чтобы вы могли правильно связать вызовы .get в случае первого сбоя.

d.get('ham',{}).get('fry',88)

Вы также можете использовать попытку, кроме блока

def get_ham_fry()
  try:
    return d['ham']['fry']
  except AttributeError,e:
    return 88
1 голос
/ 13 июня 2012

Вот решение для работы с вложенными словарями:

def get(root, *keys):
    """
    Returns root[k_1][k_2]...[k_n] if all k_1, ..., k_n are valid keys/indices. 
    Returns None otherwise
    """
    if not keys:
        return root
    if keys[0] not in root:
        return None
    if keys[0] in root:
        return get(root[keys[0]], *keys[1:])

Использование:

>>> d = {'a': 1, 'b': {'c': 3}}
>>> get(d, 'b', 'c')
3
>>> get(d. 'key that's not in d')
None
>>> get(d)
{'a': 1, 'b': {'c': 3}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...