2015-10-12 4 views
3

Существует 3 типа записей в вложенном defaultdict a структуры a=defaultdict(lambda: defaultdict(list)).python defaultdict Как я могу проверить, существует ли вложенный ключ или нет [], без создания ключа

for i in a: 
    print a[i] 

defaultdict(<type 'list'>, {'ldap_uidnumber': [['10002']], 'file': ['ABC', 'xyz']}) 
defaultdict(<type 'list'>, {'ldap_uidnumber': [], 'file': ['abcd']}) 
defaultdict(<type 'list'>, {'file': ['/home/testuser/.ssh/id_rsa.pub']}) 
  1. Как отфильтровать второй, с ldap_uidnumber: []?
  2. Как отфильтровать третий без ключа ldap_uidnumber?

Кода я пробовал:

for i in a: 
    if a[i]["ldap_uidnumber"] and a[i]["ldap_uidnumber"] == []: 
     print i 

Но это ничего не печатает, но создает ключ в третьем значении после этого кода, и выглядит как

defaultdict(<type 'list'>, {'ldap_uidnumber': [], 'file': ['/home/testuser/.ssh/id_rsa.pub']}) 
+0

'if a [i] .get (" ldap_uidnumber "):'? – jureslak

ответ

3

Проверка членство использование in не создает ключ в defaultdict. Я бы порекомендовал это.

for i in a: 
    if "ldap_uidnumber" in a[i] and  # shortcircuit here in your 3rd el 
      not a[i]['ldap_uidnumber']: # fail here in your 1st el 
     # do something 
+0

Спасибо. Работал как шарм. – file2cable

4

Использование defaultdict.get, который не будет создавать ключи на отсутствие и будет возвращать None если ключ не существует, или если присутствует значение - None и [] в логическом контексте как False, так что ваш код будет выглядеть так:

for i in a: 
    if a[i].get('ldap_uidnumber', []): 
     # It's not missing or empty - do something... 
+0

Вам нужно быть осторожным, так как вы войдете в этот блок как на 2-й, так и на 3-й позиции. Мое предположение заключалось в том, что OP искал элементы, у которых был ключ 'ldap_uidnumber', который был пустым, и пытался исключить элементы, которые не имели этого ключа. –

+0

Возможно, использование значения по умолчанию для метода 'get' было бы хорошим, если вы не хотите использовать' try-except' для обработки исключения. – Kasramvd

+2

@Kasramvd 'defaultdict.get' вернет значение по умолчанию' None', если иное не указано иначе ... –