Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2012 21:47:13

chand
Зарегистрирован: 2012-05-15
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка ключа в словаре

Привет, подскажите что-то типа, isset в php чтобы можно было проверить, на существование индекса, любую вложенисть словаря. Например так:

test_json.has_key(['response'][0]['user']['first_name'])

Офлайн

#2 Май 30, 2012 22:10:39

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Проверка ключа в словаре

Вроде такого нет, но можно написать:

def has_nested_key(dict_or_list, *keys):
    for key in keys:
        try:
            dict_or_list = dict_or_list[key]
        except (KeyError, IndexError):
            return False
    return True
 
# usage
data = {'response': [{'user':{'first_name': 'some_name'}}]}
 
print has_nested_key(data, 'response', 0, 'user', 'first_name')
print has_nested_key(data, 'response', 0, 'user', 'last_name')
print has_nested_key(data, 'response', 1, 'user', 'first_name')

upd:
Еще можно collections.defaultdict использовать

Недавно в rss упало:
http://blogs.fluidinfo.com/terry/2012/05/26/autovivification-in-python-nested-defaultdicts-with-a-specific-final-type/
from collections import defaultdict
def tree():
    return defaultdict(tree)
 
lupin = tree()
lupin["express"][3] = "stand and deliver"

Отредактировано reclosedev (Май 30, 2012 22:14:55)

Офлайн

#3 Май 30, 2012 22:19:09

chand
Зарегистрирован: 2012-05-15
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Проверка ключа в словаре

Если я правильно понял, то функция проверяет только первый ключ, с set который передали. Исправьте пожалуйста, если ошибаюсь. Вы натолкнули на мысль, что можно просто использовать try и ловить KeyError

Офлайн

#4 Май 30, 2012 22:31:39

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Проверка ключа в словаре

chand
Если я правильно понял, то функция проверяет только первый ключ, с set который передали.
Нет, по всем проверяет.
chand
Вы натолкнули на мысль, что можно просто использовать try и ловить KeyError
Точно, можно и так . Только если в словаре могут быть списки, то надо еще IndexError ловить. И с функцией можно несколько строчек сэкономить, но это уже от использования зависит.

Офлайн

#5 Май 31, 2012 01:56:57

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

Проверка ключа в словаре

А можно сделать смешанную структуру данных, типа dict(list)?

x.append(3)?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version