/ / python defaultdict jak mogę sprawdzić, czy istnieje zagnieżdżony klucz lub jest on [] bez tworzenia klucza - python, słownik, struktury danych, defaultdict

python defaultdict Jak mogę sprawdzić, czy istnieje zagnieżdżony klucz, czy jest [] bez tworzenia klucza - python, słownik, struktury danych, defaultdict

Istnieją 3 typy wpisów w zagnieżdżonym domyślnym dykcie a struktury a=defaultdict(lambda: defaultdict(list)).

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. Jak odfiltrować drugi, za pomocą ldap_uidnumber: []?
  2. Jak odfiltrować trzeci bez klucza ldap_uidnumber w ogóle?

Kod, który próbowałem:

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

Ale to nic nie wypisuje, ale tworzy klucz w trzeciej wartości po tym kodzie i wygląda na to

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

Odpowiedzi:

3 dla odpowiedzi № 1

Sprawdzanie członkostwa za pomocą in nie tworzy klucza w defaultdict. Poleciłbym to.

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

4 dla odpowiedzi nr 2

Posługiwać się defaultdict.get który nie utworzy kluczy pod nieobecność i wróci None jeśli klucz nie istnieje lub wartość, jeśli istnieje - None i [] są oboje False w kontekście logicznym, więc kod staje się:

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